134 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-3-Clause
 | |
|  */
 | |
| 
 | |
| #ifndef _USB_COMMON_H
 | |
| #define _USB_COMMON_H
 | |
| 
 | |
| #include "pico/types.h"
 | |
| #include "hardware/structs/usb.h"
 | |
| 
 | |
| // bmRequestType bit definitions
 | |
| #define USB_REQ_TYPE_STANDARD 0x00u
 | |
| #define USB_REQ_TYPE_TYPE_MASK 0x60u
 | |
| #define USB_REQ_TYPE_TYPE_CLASS 0x20u
 | |
| #define USB_REQ_TYPE_TYPE_VENDOR 0x40u
 | |
| 
 | |
| #define USB_REQ_TYPE_RECIPIENT_MASK 0x1fu
 | |
| #define USB_REQ_TYPE_RECIPIENT_DEVICE 0x00u
 | |
| #define USB_REQ_TYPE_RECIPIENT_INTERFACE 0x01u
 | |
| #define USB_REQ_TYPE_RECIPIENT_ENDPOINT 0x02u
 | |
| 
 | |
| #define USB_DIR_OUT 0x00u
 | |
| #define USB_DIR_IN 0x80u
 | |
| 
 | |
| #define USB_TRANSFER_TYPE_CONTROL 0x0
 | |
| #define USB_TRANSFER_TYPE_ISOCHRONOUS 0x1
 | |
| #define USB_TRANSFER_TYPE_BULK 0x2
 | |
| #define USB_TRANSFER_TYPE_INTERRUPT 0x3
 | |
| #define USB_TRANSFER_TYPE_BITS 0x3
 | |
| 
 | |
| // Descriptor types
 | |
| #define USB_DT_DEVICE 0x01
 | |
| #define USB_DT_CONFIG 0x02
 | |
| #define USB_DT_STRING 0x03
 | |
| #define USB_DT_INTERFACE 0x04
 | |
| #define USB_DT_ENDPOINT 0x05
 | |
| 
 | |
| #define USB_REQUEST_GET_STATUS 0x0
 | |
| #define USB_REQUEST_CLEAR_FEATURE 0x01
 | |
| #define USB_REQUEST_SET_FEATURE 0x03
 | |
| #define USB_REQUEST_SET_ADDRESS 0x05
 | |
| #define USB_REQUEST_GET_DESCRIPTOR 0x06
 | |
| #define USB_REQUEST_SET_DESCRIPTOR 0x07
 | |
| #define USB_REQUEST_GET_CONFIGURATION 0x08
 | |
| #define USB_REQUEST_SET_CONFIGURATION 0x09
 | |
| #define USB_REQUEST_GET_INTERFACE 0x0a
 | |
| #define USB_REQUEST_SET_INTERFACE 0x0b
 | |
| #define USB_REQUEST_SYNC_FRAME 0x0c
 | |
| 
 | |
| #define USB_REQUEST_MSC_GET_MAX_LUN 0xfe
 | |
| #define USB_REQUEST_MSC_RESET 0xff
 | |
| 
 | |
| #define USB_FEAT_ENDPOINT_HALT            0x00
 | |
| #define USB_FEAT_DEVICE_REMOTE_WAKEUP   0x01
 | |
| #define USB_FEAT_TEST_MODE                0x02
 | |
| 
 | |
| #define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05
 | |
| 
 | |
| struct usb_setup_packet {
 | |
|     uint8_t bmRequestType;
 | |
|     uint8_t bRequest;
 | |
|     uint16_t wValue;
 | |
|     uint16_t wIndex;
 | |
|     uint16_t wLength;
 | |
| } __packed;
 | |
| 
 | |
| struct usb_descriptor {
 | |
|     uint8_t bLength;
 | |
|     uint8_t bDescriptorType;
 | |
| };
 | |
| 
 | |
| struct usb_device_descriptor {
 | |
|     uint8_t bLength;
 | |
|     uint8_t bDescriptorType;
 | |
|     uint16_t bcdUSB;
 | |
|     uint8_t bDeviceClass;
 | |
|     uint8_t bDeviceSubClass;
 | |
|     uint8_t bDeviceProtocol;
 | |
|     uint8_t bMaxPacketSize0;
 | |
|     uint16_t idVendor;
 | |
|     uint16_t idProduct;
 | |
|     uint16_t bcdDevice;
 | |
|     uint8_t iManufacturer;
 | |
|     uint8_t iProduct;
 | |
|     uint8_t iSerialNumber;
 | |
|     uint8_t bNumConfigurations;
 | |
| } __packed;
 | |
| 
 | |
| struct usb_configuration_descriptor {
 | |
|     uint8_t bLength;
 | |
|     uint8_t bDescriptorType;
 | |
|     uint16_t wTotalLength;
 | |
|     uint8_t bNumInterfaces;
 | |
|     uint8_t bConfigurationValue;
 | |
|     uint8_t iConfiguration;
 | |
|     uint8_t bmAttributes;
 | |
|     uint8_t bMaxPower;
 | |
| } __packed;
 | |
| 
 | |
| struct usb_interface_descriptor {
 | |
|     uint8_t bLength;
 | |
|     uint8_t bDescriptorType;
 | |
|     uint8_t bInterfaceNumber;
 | |
|     uint8_t bAlternateSetting;
 | |
|     uint8_t bNumEndpoints;
 | |
|     uint8_t bInterfaceClass;
 | |
|     uint8_t bInterfaceSubClass;
 | |
|     uint8_t bInterfaceProtocol;
 | |
|     uint8_t iInterface;
 | |
| } __packed;
 | |
| 
 | |
| struct usb_endpoint_descriptor {
 | |
|     uint8_t bLength;
 | |
|     uint8_t bDescriptorType;
 | |
|     uint8_t bEndpointAddress;
 | |
|     uint8_t bmAttributes;
 | |
|     uint16_t wMaxPacketSize;
 | |
|     uint8_t bInterval;
 | |
| } __packed;
 | |
| 
 | |
| struct usb_endpoint_descriptor_long {
 | |
|     uint8_t bLength;
 | |
|     uint8_t bDescriptorType;
 | |
|     uint8_t bEndpointAddress;
 | |
|     uint8_t bmAttributes;
 | |
|     uint16_t wMaxPacketSize;
 | |
|     uint8_t bInterval;
 | |
|     uint8_t bRefresh;
 | |
|     uint8_t bSyncAddr;
 | |
| } __attribute__((packed));
 | |
| 
 | |
| #endif |