[Core] Add Raspberry Pi RP2040 support (#14877)
* Disable RESET keycode because of naming conflicts * Add Pico SDK as submodule * Add RP2040 build support to QMK * Adjust USB endpoint structs for RP2040 * Add RP2040 bootloader and double-tap reset routine * Add generic and pro micro RP2040 boards * Add RP2040 onekey keyboard * Add WS2812 PIO DMA enabled driver and documentation Supports regular and open-drain output configuration. RP2040 GPIOs are sadly not 5V tolerant, so this is a bit use-less or needs extra hardware or you take the risk to fry your hardware. * Adjust SIO Driver for RP2040 * Adjust I2C Driver for RP2040 * Adjust SPI Driver for RP2040 * Add PIO serial driver and documentation * Add general RP2040 documentation * Apply suggestions from code review Co-authored-by: Nick Brassel <nick@tzarc.org> Co-authored-by: Nick Brassel <nick@tzarc.org>
This commit is contained in:
		
							parent
							
								
									d206c1791e
								
							
						
					
					
						commit
						d717396708
					
				
					 43 changed files with 2026 additions and 96 deletions
				
			
		| 
						 | 
				
			
			@ -32,6 +32,7 @@
 | 
			
		|||
#include "usb_main.h"
 | 
			
		||||
 | 
			
		||||
#include "host.h"
 | 
			
		||||
#include "chibios_config.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "suspend.h"
 | 
			
		||||
#ifdef SLEEP_LED_ENABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -91,6 +92,13 @@ uint8_t extra_report_blank[3] = {0};
 | 
			
		|||
 * ---------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* USB Low Level driver specific endpoint fields */
 | 
			
		||||
#if !defined(usb_lld_endpoint_fields)
 | 
			
		||||
#    define usb_lld_endpoint_fields   \
 | 
			
		||||
        2,        /* IN multiplier */ \
 | 
			
		||||
            NULL, /* SETUP buffer (not a SETUP endpoint) */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* HID specific constants */
 | 
			
		||||
#define HID_GET_REPORT 0x01
 | 
			
		||||
#define HID_GET_IDLE 0x02
 | 
			
		||||
| 
						 | 
				
			
			@ -121,16 +129,15 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype
 | 
			
		|||
static USBInEndpointState kbd_ep_state;
 | 
			
		||||
/* keyboard endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
 | 
			
		||||
static const USBEndpointConfig kbd_ep_config = {
 | 
			
		||||
    USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
 | 
			
		||||
    NULL,                  /* SETUP packet notification callback */
 | 
			
		||||
    kbd_in_cb,             /* IN notification callback */
 | 
			
		||||
    NULL,                  /* OUT notification callback */
 | 
			
		||||
    KEYBOARD_EPSIZE,       /* IN maximum packet size */
 | 
			
		||||
    0,                     /* OUT maximum packet size */
 | 
			
		||||
    &kbd_ep_state,         /* IN Endpoint state */
 | 
			
		||||
    NULL,                  /* OUT endpoint state */
 | 
			
		||||
    2,                     /* IN multiplier */
 | 
			
		||||
    NULL                   /* SETUP buffer (not a SETUP endpoint) */
 | 
			
		||||
    USB_EP_MODE_TYPE_INTR,  /* Interrupt EP */
 | 
			
		||||
    NULL,                   /* SETUP packet notification callback */
 | 
			
		||||
    kbd_in_cb,              /* IN notification callback */
 | 
			
		||||
    NULL,                   /* OUT notification callback */
 | 
			
		||||
    KEYBOARD_EPSIZE,        /* IN maximum packet size */
 | 
			
		||||
    0,                      /* OUT maximum packet size */
 | 
			
		||||
    &kbd_ep_state,          /* IN Endpoint state */
 | 
			
		||||
    NULL,                   /* OUT endpoint state */
 | 
			
		||||
    usb_lld_endpoint_fields /* USB driver specific endpoint fields */
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -140,16 +147,15 @@ static USBInEndpointState mouse_ep_state;
 | 
			
		|||
 | 
			
		||||
/* mouse endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
 | 
			
		||||
static const USBEndpointConfig mouse_ep_config = {
 | 
			
		||||
    USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
 | 
			
		||||
    NULL,                  /* SETUP packet notification callback */
 | 
			
		||||
    mouse_in_cb,           /* IN notification callback */
 | 
			
		||||
    NULL,                  /* OUT notification callback */
 | 
			
		||||
    MOUSE_EPSIZE,          /* IN maximum packet size */
 | 
			
		||||
    0,                     /* OUT maximum packet size */
 | 
			
		||||
    &mouse_ep_state,       /* IN Endpoint state */
 | 
			
		||||
    NULL,                  /* OUT endpoint state */
 | 
			
		||||
    2,                     /* IN multiplier */
 | 
			
		||||
    NULL                   /* SETUP buffer (not a SETUP endpoint) */
 | 
			
		||||
    USB_EP_MODE_TYPE_INTR,  /* Interrupt EP */
 | 
			
		||||
    NULL,                   /* SETUP packet notification callback */
 | 
			
		||||
    mouse_in_cb,            /* IN notification callback */
 | 
			
		||||
    NULL,                   /* OUT notification callback */
 | 
			
		||||
    MOUSE_EPSIZE,           /* IN maximum packet size */
 | 
			
		||||
    0,                      /* OUT maximum packet size */
 | 
			
		||||
    &mouse_ep_state,        /* IN Endpoint state */
 | 
			
		||||
    NULL,                   /* OUT endpoint state */
 | 
			
		||||
    usb_lld_endpoint_fields /* USB driver specific endpoint fields */
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -159,16 +165,15 @@ static USBInEndpointState shared_ep_state;
 | 
			
		|||
 | 
			
		||||
/* shared endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
 | 
			
		||||
static const USBEndpointConfig shared_ep_config = {
 | 
			
		||||
    USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
 | 
			
		||||
    NULL,                  /* SETUP packet notification callback */
 | 
			
		||||
    shared_in_cb,          /* IN notification callback */
 | 
			
		||||
    NULL,                  /* OUT notification callback */
 | 
			
		||||
    SHARED_EPSIZE,         /* IN maximum packet size */
 | 
			
		||||
    0,                     /* OUT maximum packet size */
 | 
			
		||||
    &shared_ep_state,      /* IN Endpoint state */
 | 
			
		||||
    NULL,                  /* OUT endpoint state */
 | 
			
		||||
    2,                     /* IN multiplier */
 | 
			
		||||
    NULL                   /* SETUP buffer (not a SETUP endpoint) */
 | 
			
		||||
    USB_EP_MODE_TYPE_INTR,  /* Interrupt EP */
 | 
			
		||||
    NULL,                   /* SETUP packet notification callback */
 | 
			
		||||
    shared_in_cb,           /* IN notification callback */
 | 
			
		||||
    NULL,                   /* OUT notification callback */
 | 
			
		||||
    SHARED_EPSIZE,          /* IN maximum packet size */
 | 
			
		||||
    0,                      /* OUT maximum packet size */
 | 
			
		||||
    &shared_ep_state,       /* IN Endpoint state */
 | 
			
		||||
    NULL,                   /* OUT endpoint state */
 | 
			
		||||
    usb_lld_endpoint_fields /* USB driver specific endpoint fields */
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -251,29 +256,27 @@ typedef struct {
 | 
			
		|||
            .queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY,                             \
 | 
			
		||||
            .in_ep_config =                                                                                                     \
 | 
			
		||||
                {                                                                                                               \
 | 
			
		||||
                    stream##_IN_MODE,      /* Interrupt EP */                                                                   \
 | 
			
		||||
                    NULL,                  /* SETUP packet notification callback */                                             \
 | 
			
		||||
                    qmkusbDataTransmitted, /* IN notification callback */                                                       \
 | 
			
		||||
                    NULL,                  /* OUT notification callback */                                                      \
 | 
			
		||||
                    stream##_EPSIZE,       /* IN maximum packet size */                                                         \
 | 
			
		||||
                    0,                     /* OUT maximum packet size */                                                        \
 | 
			
		||||
                    NULL,                  /* IN Endpoint state */                                                              \
 | 
			
		||||
                    NULL,                  /* OUT endpoint state */                                                             \
 | 
			
		||||
                    2,                     /* IN multiplier */                                                                  \
 | 
			
		||||
                    NULL                   /* SETUP buffer (not a SETUP endpoint) */                                            \
 | 
			
		||||
                    stream##_IN_MODE,       /* Interrupt EP */                                                                  \
 | 
			
		||||
                    NULL,                   /* SETUP packet notification callback */                                            \
 | 
			
		||||
                    qmkusbDataTransmitted,  /* IN notification callback */                                                      \
 | 
			
		||||
                    NULL,                   /* OUT notification callback */                                                     \
 | 
			
		||||
                    stream##_EPSIZE,        /* IN maximum packet size */                                                        \
 | 
			
		||||
                    0,                      /* OUT maximum packet size */                                                       \
 | 
			
		||||
                    NULL,                   /* IN Endpoint state */                                                             \
 | 
			
		||||
                    NULL,                   /* OUT endpoint state */                                                            \
 | 
			
		||||
                    usb_lld_endpoint_fields /* USB driver specific endpoint fields */                                           \
 | 
			
		||||
                },                                                                                                              \
 | 
			
		||||
            .out_ep_config =                                                                                                    \
 | 
			
		||||
                {                                                                                                               \
 | 
			
		||||
                    stream##_OUT_MODE,  /* Interrupt EP */                                                                      \
 | 
			
		||||
                    NULL,               /* SETUP packet notification callback */                                                \
 | 
			
		||||
                    NULL,               /* IN notification callback */                                                          \
 | 
			
		||||
                    qmkusbDataReceived, /* OUT notification callback */                                                         \
 | 
			
		||||
                    0,                  /* IN maximum packet size */                                                            \
 | 
			
		||||
                    stream##_EPSIZE,    /* OUT maximum packet size */                                                           \
 | 
			
		||||
                    NULL,               /* IN Endpoint state */                                                                 \
 | 
			
		||||
                    NULL,               /* OUT endpoint state */                                                                \
 | 
			
		||||
                    2,                  /* IN multiplier */                                                                     \
 | 
			
		||||
                    NULL,               /* SETUP buffer (not a SETUP endpoint) */                                               \
 | 
			
		||||
                    stream##_OUT_MODE,      /* Interrupt EP */                                                                  \
 | 
			
		||||
                    NULL,                   /* SETUP packet notification callback */                                            \
 | 
			
		||||
                    NULL,                   /* IN notification callback */                                                      \
 | 
			
		||||
                    qmkusbDataReceived,     /* OUT notification callback */                                                     \
 | 
			
		||||
                    0,                      /* IN maximum packet size */                                                        \
 | 
			
		||||
                    stream##_EPSIZE,        /* OUT maximum packet size */                                                       \
 | 
			
		||||
                    NULL,                   /* IN Endpoint state */                                                             \
 | 
			
		||||
                    NULL,                   /* OUT endpoint state */                                                            \
 | 
			
		||||
                    usb_lld_endpoint_fields /* USB driver specific endpoint fields */                                           \
 | 
			
		||||
                },                                                                                                              \
 | 
			
		||||
            .int_ep_config =                                                                                                    \
 | 
			
		||||
                {                                                                                                               \
 | 
			
		||||
| 
						 | 
				
			
			@ -285,8 +288,7 @@ typedef struct {
 | 
			
		|||
                    0,                          /* OUT maximum packet size */                                                   \
 | 
			
		||||
                    NULL,                       /* IN Endpoint state */                                                         \
 | 
			
		||||
                    NULL,                       /* OUT endpoint state */                                                        \
 | 
			
		||||
                    2,                          /* IN multiplier */                                                             \
 | 
			
		||||
                    NULL,                       /* SETUP buffer (not a SETUP endpoint) */                                       \
 | 
			
		||||
                    usb_lld_endpoint_fields     /* USB driver specific endpoint fields */                                       \
 | 
			
		||||
                },                                                                                                              \
 | 
			
		||||
            .config = {                                                                                                         \
 | 
			
		||||
                .usbp        = &USB_DRIVER,                                                                                     \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue