ME11B Sample Code in Maxim Integrated Team
Dependencies: BMI160 max32630hsp3 MemoryLCD USBDevice
Fork of Host_Software_MAX32664GWEB_HR_EXTENDED by
Revision 1:f875283d1530, committed 2019-03-18
- Comitter:
- seyhmus.cacina
- Date:
- Mon Mar 18 10:27:25 2019 +0300
- Parent:
- 0:ac4dea3e2894
- Child:
- 2:d88f88b90c8e
- Commit message:
- Removes unnecessary USBDevice folder
Changed in this revision
--- a/Drivers/USBDevice/USBAudio/USBAudio.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,618 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBAudio.h"
-#include "USBAudio_Types.h"
-
-
-
-USBAudio::USBAudio(uint32_t frequency_in, uint8_t channel_nb_in, uint32_t frequency_out, uint8_t channel_nb_out, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
- mute = 0;
- volCur = 0x0080;
- volMin = 0x0000;
- volMax = 0x0100;
- volRes = 0x0004;
- available = false;
-
- FREQ_IN = frequency_in;
- FREQ_OUT = frequency_out;
-
- this->channel_nb_in = channel_nb_in;
- this->channel_nb_out = channel_nb_out;
-
- // stereo -> *2, mono -> *1
- PACKET_SIZE_ISO_IN = (FREQ_IN / 500) * channel_nb_in;
- PACKET_SIZE_ISO_OUT = (FREQ_OUT / 500) * channel_nb_out;
-
- // STEREO -> left and right
- channel_config_in = (channel_nb_in == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
- channel_config_out = (channel_nb_out == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
-
- SOF_handler = false;
-
- buf_stream_out = NULL;
- buf_stream_in = NULL;
-
- interruptOUT = false;
- writeIN = false;
- interruptIN = false;
- available = false;
-
- volume = 0;
-
- // connect the device
- USBDevice::connect();
-}
-
-bool USBAudio::read(uint8_t * buf) {
- buf_stream_in = buf;
- SOF_handler = false;
- while (!available || !SOF_handler);
- available = false;
- return true;
-}
-
-bool USBAudio::readNB(uint8_t * buf) {
- buf_stream_in = buf;
- SOF_handler = false;
- while (!SOF_handler);
- if (available) {
- available = false;
- buf_stream_in = NULL;
- return true;
- }
- return false;
-}
-
-bool USBAudio::readWrite(uint8_t * buf_read, uint8_t * buf_write) {
- buf_stream_in = buf_read;
- SOF_handler = false;
- writeIN = false;
- if (interruptIN) {
- USBDevice::writeNB(EP3IN, buf_write, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
- } else {
- buf_stream_out = buf_write;
- }
- while (!available);
- if (interruptIN) {
- while (!writeIN);
- }
- while (!SOF_handler);
- return true;
-}
-
-
-bool USBAudio::write(uint8_t * buf) {
- writeIN = false;
- SOF_handler = false;
- if (interruptIN) {
- USBDevice::writeNB(EP3IN, buf, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
- } else {
- buf_stream_out = buf;
- }
- while (!SOF_handler);
- if (interruptIN) {
- while (!writeIN);
- }
- return true;
-}
-
-
-float USBAudio::getVolume() {
- return (mute) ? 0.0 : volume;
-}
-
-
-bool USBAudio::EPISO_OUT_callback() {
- uint32_t size = 0;
- interruptOUT = true;
- if (buf_stream_in != NULL) {
- readEP(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN);
- available = true;
- buf_stream_in = NULL;
- }
- readStart(EP3OUT, PACKET_SIZE_ISO_IN);
- return false;
-}
-
-
-bool USBAudio::EPISO_IN_callback() {
- interruptIN = true;
- writeIN = true;
- return true;
-}
-
-
-
-// Called in ISR context on each start of frame
-void USBAudio::SOF(int frameNumber) {
- uint32_t size = 0;
-
- if (!interruptOUT) {
- // read the isochronous endpoint
- if (buf_stream_in != NULL) {
- if (USBDevice::readEP_NB(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN)) {
- if (size) {
- available = true;
- readStart(EP3OUT, PACKET_SIZE_ISO_IN);
- buf_stream_in = NULL;
- }
- }
- }
- }
-
- if (!interruptIN) {
- // write if needed
- if (buf_stream_out != NULL) {
- USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream_out, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
- buf_stream_out = NULL;
- }
- }
-
- SOF_handler = true;
-}
-
-
-// Called in ISR context
-// Set configuration. Return false if the configuration is not supported.
-bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {
- if (configuration != DEFAULT_CONFIGURATION) {
- return false;
- }
-
- // Configure isochronous endpoint
- realiseEndpoint(EP3OUT, PACKET_SIZE_ISO_IN, ISOCHRONOUS);
- realiseEndpoint(EP3IN, PACKET_SIZE_ISO_OUT, ISOCHRONOUS);
-
- // activate readings on this endpoint
- readStart(EP3OUT, PACKET_SIZE_ISO_IN);
- return true;
-}
-
-
-// Called in ISR context
-// Set alternate setting. Return false if the alternate setting is not supported
-bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {
- if (interface == 0 && alternate == 0) {
- return true;
- }
- if (interface == 1 && (alternate == 0 || alternate == 1)) {
- return true;
- }
- if (interface == 2 && (alternate == 0 || alternate == 1)) {
- return true;
- }
- return false;
-}
-
-
-
-// Called in ISR context
-// Called by USBDevice on Endpoint0 request
-// This is used to handle extensions to standard requests and class specific requests.
-// Return true if class handles this request
-bool USBAudio::USBCallback_request() {
- bool success = false;
- CONTROL_TRANSFER * transfer = getTransferPtr();
-
- // Process class-specific requests
- if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
-
- // Feature Unit: Interface = 0, ID = 2
- if (transfer->setup.wIndex == 0x0200) {
-
- // Master Channel
- if ((transfer->setup.wValue & 0xff) == 0) {
-
- switch (transfer->setup.wValue >> 8) {
- case MUTE_CONTROL:
- switch (transfer->setup.bRequest) {
- case REQUEST_GET_CUR:
- transfer->remaining = 1;
- transfer->ptr = &mute;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
-
- case REQUEST_SET_CUR:
- transfer->remaining = 1;
- transfer->notify = true;
- transfer->direction = HOST_TO_DEVICE;
- success = true;
- break;
- default:
- break;
- }
- break;
- case VOLUME_CONTROL:
- switch (transfer->setup.bRequest) {
- case REQUEST_GET_CUR:
- transfer->remaining = 2;
- transfer->ptr = (uint8_t *)&volCur;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
- case REQUEST_GET_MIN:
- transfer->remaining = 2;
- transfer->ptr = (uint8_t *)&volMin;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
- case REQUEST_GET_MAX:
- transfer->remaining = 2;
- transfer->ptr = (uint8_t *)&volMax;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
- case REQUEST_GET_RES:
- transfer->remaining = 2;
- transfer->ptr = (uint8_t *)&volRes;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
-
- case REQUEST_SET_CUR:
- transfer->remaining = 2;
- transfer->notify = true;
- transfer->direction = HOST_TO_DEVICE;
- success = true;
- break;
- case REQUEST_SET_MIN:
- transfer->remaining = 2;
- transfer->notify = true;
- transfer->direction = HOST_TO_DEVICE;
- success = true;
- break;
- case REQUEST_SET_MAX:
- transfer->remaining = 2;
- transfer->notify = true;
- transfer->direction = HOST_TO_DEVICE;
- success = true;
- break;
- case REQUEST_SET_RES:
- transfer->remaining = 2;
- transfer->notify = true;
- transfer->direction = HOST_TO_DEVICE;
- success = true;
- break;
- }
- break;
- default:
- break;
- }
- }
- }
- }
- return success;
-}
-
-
-// Called in ISR context when a data OUT stage has been performed
-void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {
- if ((length == 1) || (length == 2)) {
- uint16_t data = (length == 1) ? *buf : *((uint16_t *)buf);
- CONTROL_TRANSFER * transfer = getTransferPtr();
- switch (transfer->setup.wValue >> 8) {
- case MUTE_CONTROL:
- switch (transfer->setup.bRequest) {
- case REQUEST_SET_CUR:
- mute = data & 0xff;
- updateVol.call();
- break;
- default:
- break;
- }
- break;
- case VOLUME_CONTROL:
- switch (transfer->setup.bRequest) {
- case REQUEST_SET_CUR:
- volCur = data;
- volume = (float)volCur/(float)volMax;
- updateVol.call();
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
-}
-
-
-
-#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
- + (5 * INTERFACE_DESCRIPTOR_LENGTH) \
- + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1) \
- + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
- + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
- + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
- + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
- + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
- + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
- + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
-
-#define TOTAL_CONTROL_INTF_LENGTH (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1 + \
- 2*INPUT_TERMINAL_DESCRIPTOR_LENGTH + \
- FEATURE_UNIT_DESCRIPTOR_LENGTH + \
- 2*OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
-
-uint8_t * USBAudio::configurationDesc() {
- static uint8_t configDescriptor[] = {
- // Configuration 1
- CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
- CONFIGURATION_DESCRIPTOR, // bDescriptorType
- LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
- MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
- 0x03, // bNumInterfaces
- DEFAULT_CONFIGURATION, // bConfigurationValue
- 0x00, // iConfiguration
- 0x80, // bmAttributes
- 50, // bMaxPower
-
- // Interface 0, Alternate Setting 0, Audio Control
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x00, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x00, // bNumEndpoints
- AUDIO_CLASS, // bInterfaceClass
- SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass
- 0x00, // bInterfaceProtocol
- 0x00, // iInterface
-
-
- // Audio Control Interface
- CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1,// bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- CONTROL_HEADER, // bDescriptorSubtype
- LSB(0x0100), // bcdADC (LSB)
- MSB(0x0100), // bcdADC (MSB)
- LSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
- MSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
- 0x02, // bInCollection
- 0x01, // baInterfaceNr
- 0x02, // baInterfaceNr
-
- // Audio Input Terminal (Speaker)
- INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
- 0x01, // bTerminalID
- LSB(TERMINAL_USB_STREAMING), // wTerminalType
- MSB(TERMINAL_USB_STREAMING), // wTerminalType
- 0x00, // bAssocTerminal
- channel_nb_in, // bNrChannels
- (uint8_t)(LSB(channel_config_in)), // wChannelConfig
- (uint8_t)(MSB(channel_config_in)), // wChannelConfig
- 0x00, // iChannelNames
- 0x00, // iTerminal
-
- // Audio Feature Unit (Speaker)
- FEATURE_UNIT_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- CONTROL_FEATURE_UNIT, // bDescriptorSubtype
- 0x02, // bUnitID
- 0x01, // bSourceID
- 0x01, // bControlSize
- CONTROL_MUTE |
- CONTROL_VOLUME, // bmaControls(0)
- 0x00, // bmaControls(1)
- 0x00, // iTerminal
-
- // Audio Output Terminal (Speaker)
- OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
- 0x03, // bTerminalID
- LSB(TERMINAL_SPEAKER), // wTerminalType
- MSB(TERMINAL_SPEAKER), // wTerminalType
- 0x00, // bAssocTerminal
- 0x02, // bSourceID
- 0x00, // iTerminal
-
-
- // Audio Input Terminal (Microphone)
- INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
- 0x04, // bTerminalID
- LSB(TERMINAL_MICROPHONE), // wTerminalType
- MSB(TERMINAL_MICROPHONE), // wTerminalType
- 0x00, // bAssocTerminal
- channel_nb_out, // bNrChannels
- (uint8_t)(LSB(channel_config_out)), // wChannelConfig
- (uint8_t)(MSB(channel_config_out)), // wChannelConfig
- 0x00, // iChannelNames
- 0x00, // iTerminal
-
- // Audio Output Terminal (Microphone)
- OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
- 0x05, // bTerminalID
- LSB(TERMINAL_USB_STREAMING), // wTerminalType
- MSB(TERMINAL_USB_STREAMING), // wTerminalType
- 0x00, // bAssocTerminal
- 0x04, // bSourceID
- 0x00, // iTerminal
-
-
-
-
-
-
- // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x01, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x00, // bNumEndpoints
- AUDIO_CLASS, // bInterfaceClass
- SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
- 0x00, // bInterfaceProtocol
- 0x00, // iInterface
-
- // Interface 1, Alternate Setting 1, Audio Streaming - Operational
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x01, // bInterfaceNumber
- 0x01, // bAlternateSetting
- 0x01, // bNumEndpoints
- AUDIO_CLASS, // bInterfaceClass
- SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
- 0x00, // bInterfaceProtocol
- 0x00, // iInterface
-
- // Audio Streaming Interface
- STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- STREAMING_GENERAL, // bDescriptorSubtype
- 0x01, // bTerminalLink
- 0x00, // bDelay
- LSB(FORMAT_PCM), // wFormatTag
- MSB(FORMAT_PCM), // wFormatTag
-
- // Audio Type I Format
- FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- STREAMING_FORMAT_TYPE, // bDescriptorSubtype
- FORMAT_TYPE_I, // bFormatType
- channel_nb_in, // bNrChannels
- 0x02, // bSubFrameSize
- 16, // bBitResolution
- 0x01, // bSamFreqType
- (uint8_t)(LSB(FREQ_IN)), // tSamFreq
- (uint8_t)((FREQ_IN >> 8) & 0xff), // tSamFreq
- (uint8_t)((FREQ_IN >> 16) & 0xff), // tSamFreq
-
- // Endpoint - Standard Descriptor
- ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPISO_OUT), // bEndpointAddress
- E_ISOCHRONOUS, // bmAttributes
- (uint8_t)(LSB(PACKET_SIZE_ISO_IN)), // wMaxPacketSize
- (uint8_t)(MSB(PACKET_SIZE_ISO_IN)), // wMaxPacketSize
- 0x01, // bInterval
- 0x00, // bRefresh
- 0x00, // bSynchAddress
-
- // Endpoint - Audio Streaming
- STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
- ENDPOINT_GENERAL, // bDescriptor
- 0x00, // bmAttributes
- 0x00, // bLockDelayUnits
- LSB(0x0000), // wLockDelay
- MSB(0x0000), // wLockDelay
-
-
-
-
-
-
-
- // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x02, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x00, // bNumEndpoints
- AUDIO_CLASS, // bInterfaceClass
- SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
- 0x00, // bInterfaceProtocol
- 0x00, // iInterface
-
- // Interface 1, Alternate Setting 1, Audio Streaming - Operational
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x02, // bInterfaceNumber
- 0x01, // bAlternateSetting
- 0x01, // bNumEndpoints
- AUDIO_CLASS, // bInterfaceClass
- SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
- 0x00, // bInterfaceProtocol
- 0x00, // iInterface
-
- // Audio Streaming Interface
- STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- SUBCLASS_AUDIOCONTROL, // bDescriptorSubtype
- 0x05, // bTerminalLink (output terminal microphone)
- 0x01, // bDelay
- 0x01, // wFormatTag
- 0x00, // wFormatTag
-
- // Audio Type I Format
- FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
- SUBCLASS_AUDIOSTREAMING, // bDescriptorSubtype
- FORMAT_TYPE_I, // bFormatType
- channel_nb_out, // bNrChannels
- 0x02, // bSubFrameSize
- 0x10, // bBitResolution
- 0x01, // bSamFreqType
- (uint8_t)(LSB(FREQ_OUT)), // tSamFreq
- (uint8_t)((FREQ_OUT >> 8) & 0xff), // tSamFreq
- (uint8_t)((FREQ_OUT >> 16) & 0xff), // tSamFreq
-
- // Endpoint - Standard Descriptor
- ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPISO_IN), // bEndpointAddress
- E_ISOCHRONOUS, // bmAttributes
- (uint8_t)(LSB(PACKET_SIZE_ISO_OUT)), // wMaxPacketSize
- (uint8_t)(MSB(PACKET_SIZE_ISO_OUT)), // wMaxPacketSize
- 0x01, // bInterval
- 0x00, // bRefresh
- 0x00, // bSynchAddress
-
- // Endpoint - Audio Streaming
- STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
- ENDPOINT_GENERAL, // bDescriptor
- 0x00, // bmAttributes
- 0x00, // bLockDelayUnits
- LSB(0x0000), // wLockDelay
- MSB(0x0000), // wLockDelay
-
- // Terminator
- 0 // bLength
- };
- return configDescriptor;
-}
-
-uint8_t * USBAudio::stringIinterfaceDesc() {
- static uint8_t stringIinterfaceDescriptor[] = {
- 0x0c, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'A',0,'u',0,'d',0,'i',0,'o',0 //bString iInterface - Audio
- };
- return stringIinterfaceDescriptor;
-}
-
-uint8_t * USBAudio::stringIproductDesc() {
- static uint8_t stringIproductDescriptor[] = {
- 0x16, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
- };
- return stringIproductDescriptor;
-}
--- a/Drivers/USBDevice/USBAudio/USBAudio.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,287 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBAudio_H
-#define USBAudio_H
-
-/* These headers are included for child class. */
-#include "USBEndpoints.h"
-#include "USBDescriptor.h"
-#include "USBDevice_Types.h"
-
-#include "USBDevice.h"
-
-
-/**
-* USBAudio example
-*
-* @code
-* #include "mbed.h"
-* #include "USBAudio.h"
-*
-* Serial pc(USBTX, USBRX);
-*
-* // frequency: 48 kHz
-* #define FREQ 48000
-*
-* // 1 channel: mono
-* #define NB_CHA 1
-*
-* // length of an audio packet: each ms, we receive 48 * 16bits ->48 * 2 bytes. as there is one channel, the length will be 48 * 2 * 1
-* #define AUDIO_LENGTH_PACKET 48 * 2 * 1
-*
-* // USBAudio
-* USBAudio audio(FREQ, NB_CHA);
-*
-* int main() {
-* int16_t buf[AUDIO_LENGTH_PACKET/2];
-*
-* while (1) {
-* // read an audio packet
-* audio.read((uint8_t *)buf);
-*
-*
-* // print packet received
-* pc.printf("recv: ");
-* for(int i = 0; i < AUDIO_LENGTH_PACKET/2; i++) {
-* pc.printf("%d ", buf[i]);
-* }
-* pc.printf("\r\n");
-* }
-* }
-* @endcode
-*/
-class USBAudio: public USBDevice {
-public:
-
- /**
- * Constructor
- *
- * @param frequency_in frequency in Hz (default: 48000)
- * @param channel_nb_in channel number (1 or 2) (default: 1)
- * @param frequency_out frequency in Hz (default: 8000)
- * @param channel_nb_out_in channel number (1 or 2) (default: 1)
- * @param vendor_id Your vendor_id
- * @param product_id Your product_id
- * @param product_release Your preoduct_release
- */
- USBAudio(uint32_t frequency_in = 48000, uint8_t channel_nb_in = 1, uint32_t frequency_out = 8000, uint8_t channel_nb_out = 1, uint16_t vendor_id = 0x7bb8, uint16_t product_id = 0x1111, uint16_t product_release = 0x0100);
-
- /**
- * Get current volume between 0.0 and 1.0
- *
- * @returns volume
- */
- float getVolume();
-
- /**
- * Read an audio packet. During a frame, only a single reading (you can't write and read an audio packet during the same frame)can be done using this method. Warning: Blocking
- *
- * @param buf pointer on a buffer which will be filled with an audio packet
- *
- * @returns true if successfull
- */
- bool read(uint8_t * buf);
-
- /**
- * Try to read an audio packet. During a frame, only a single reading (you can't write and read an audio packet during the same frame)can be done using this method. Warning: Non Blocking
- *
- * @param buf pointer on a buffer which will be filled if an audio packet is available
- *
- * @returns true if successfull
- */
- bool readNB(uint8_t * buf);
-
- /**
- * Write an audio packet. During a frame, only a single writing (you can't write and read an audio packet during the same frame)can be done using this method.
- *
- * @param buf pointer on the audio packet which will be sent
- * @returns true if successful
- */
- bool write(uint8_t * buf);
-
- /**
- * Write and read an audio packet at the same time (on the same frame)
- *
- * @param buf_read pointer on a buffer which will be filled with an audio packet
- * @param buf_write pointer on the audio packet which will be sent
- * @returns true if successful
- */
- bool readWrite(uint8_t * buf_read, uint8_t * buf_write);
-
-
- /** attach a handler to update the volume
- *
- * @param function Function to attach
- *
- */
- void attach(void(*fptr)(void)) {
- updateVol.attach(fptr);
- }
-
- /** Attach a nonstatic void/void member function to update the volume
- *
- * @param tptr Object pointer
- * @param mptr Member function pointer
- *
- */
- template<typename T>
- void attach(T *tptr, void(T::*mptr)(void)) {
- updateVol.attach(tptr, mptr);
- }
-
-
-protected:
-
- /*
- * Called by USBDevice layer. Set configuration of the device.
- * For instance, you can add all endpoints that you need on this function.
- *
- * @param configuration Number of the configuration
- * @returns true if class handles this request
- */
- virtual bool USBCallback_setConfiguration(uint8_t configuration);
-
- /*
- * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
- * This is used to handle extensions to standard requests
- * and class specific requests
- *
- * @returns true if class handles this request
- */
- virtual bool USBCallback_request();
-
- /*
- * Get string product descriptor
- *
- * @returns pointer to the string product descriptor
- */
- virtual uint8_t * stringIproductDesc();
-
- /*
- * Get string interface descriptor
- *
- * @returns pointer to the string interface descriptor
- */
- virtual uint8_t * stringIinterfaceDesc();
-
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
- /*
- * Called by USBDevice layer. Set interface/alternate of the device.
- *
- * @param interface Number of the interface to be configured
- * @param alternate Number of the alternate to be configured
- * @returns true if class handles this request
- */
- virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate);
-
- /*
- * Called by USBDevice on Endpoint0 request completion
- * if the 'notify' flag has been set to true. Warning: Called in ISR context
- *
- * In this case it is used to indicate that a HID report has
- * been received from the host on endpoint 0
- *
- * @param buf buffer received on endpoint 0
- * @param length length of this buffer
- */
- virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length);
-
- /*
- * Callback called on each Start of Frame event
- */
- virtual void SOF(int frameNumber);
-
- /*
- * Callback called when a packet is received
- */
- virtual bool EPISO_OUT_callback();
-
- /*
- * Callback called when a packet has been sent
- */
- virtual bool EPISO_IN_callback();
-
-private:
-
- // stream available ?
- volatile bool available;
-
- // interrupt OUT has been received
- volatile bool interruptOUT;
-
- // interrupt IN has been received
- volatile bool interruptIN;
-
- // audio packet has been written
- volatile bool writeIN;
-
- // FREQ
- uint32_t FREQ_OUT;
- uint32_t FREQ_IN;
-
- // size of the maximum packet for the isochronous endpoint
- uint32_t PACKET_SIZE_ISO_IN;
- uint32_t PACKET_SIZE_ISO_OUT;
-
- // mono, stereo,...
- uint8_t channel_nb_in;
- uint8_t channel_nb_out;
-
- // channel config: master, left, right
- uint8_t channel_config_in;
- uint8_t channel_config_out;
-
- // mute state
- uint8_t mute;
-
- // Volume Current Value
- uint16_t volCur;
-
- // Volume Minimum Value
- uint16_t volMin;
-
- // Volume Maximum Value
- uint16_t volMax;
-
- // Volume Resolution
- uint16_t volRes;
-
- // Buffer containing one audio packet (to be read)
- volatile uint8_t * buf_stream_in;
-
- // Buffer containing one audio packet (to be written)
- volatile uint8_t * buf_stream_out;
-
- // callback to update volume
- FunctionPointer updateVol;
-
- // boolean showing that the SOF handler has been called. Useful for readNB.
- volatile bool SOF_handler;
-
- volatile float volume;
-
-};
-
-#endif
--- a/Drivers/USBDevice/USBAudio/USBAudio_Types.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef USBAUDIO_TYPES_H -#define USBAUDIO_TYPES_H - - -#define DEFAULT_CONFIGURATION (1) - -// Audio Request Codes -#define REQUEST_SET_CUR 0x01 -#define REQUEST_GET_CUR 0x81 -#define REQUEST_SET_MIN 0x02 -#define REQUEST_GET_MIN 0x82 -#define REQUEST_SET_MAX 0x03 -#define REQUEST_GET_MAX 0x83 -#define REQUEST_SET_RES 0x04 -#define REQUEST_GET_RES 0x84 - -#define MUTE_CONTROL 0x01 -#define VOLUME_CONTROL 0x02 - - -// Audio Descriptor Sizes -#define CONTROL_INTERFACE_DESCRIPTOR_LENGTH 0x09 -#define STREAMING_INTERFACE_DESCRIPTOR_LENGTH 0x07 -#define INPUT_TERMINAL_DESCRIPTOR_LENGTH 0x0C -#define OUTPUT_TERMINAL_DESCRIPTOR_LENGTH 0x09 -#define FEATURE_UNIT_DESCRIPTOR_LENGTH 0x09 -#define STREAMING_ENDPOINT_DESCRIPTOR_LENGTH 0x07 - -// Audio Format Type Descriptor Sizes -#define FORMAT_TYPE_I_DESCRIPTOR_LENGTH 0x0b - -#define AUDIO_CLASS 0x01 -#define SUBCLASS_AUDIOCONTROL 0x01 -#define SUBCLASS_AUDIOSTREAMING 0x02 - -// Audio Descriptor Types -#define INTERFACE_DESCRIPTOR_TYPE 0x24 -#define ENDPOINT_DESCRIPTOR_TYPE 0x25 - -// Audio Control Interface Descriptor Subtypes -#define CONTROL_HEADER 0x01 -#define CONTROL_INPUT_TERMINAL 0x02 -#define CONTROL_OUTPUT_TERMINAL 0x03 -#define CONTROL_FEATURE_UNIT 0x06 - -// USB Terminal Types -#define TERMINAL_USB_STREAMING 0x0101 - -// Predefined Audio Channel Configuration Bits -// Mono -#define CHANNEL_M 0x0000 -#define CHANNEL_L 0x0001 /* Left Front */ -#define CHANNEL_R 0x0002 /* Right Front */ - -// Feature Unit Control Bits -#define CONTROL_MUTE 0x0001 -#define CONTROL_VOLUME 0x0002 - -// Input Terminal Types -#define TERMINAL_MICROPHONE 0x0201 - -// Output Terminal Types -#define TERMINAL_SPEAKER 0x0301 -#define TERMINAL_HEADPHONES 0x0302 - -// Audio Streaming Interface Descriptor Subtypes -#define STREAMING_GENERAL 0x01 -#define STREAMING_FORMAT_TYPE 0x02 - -// Audio Data Format Type I Codes -#define FORMAT_PCM 0x0001 - -// Audio Format Types -#define FORMAT_TYPE_I 0x01 - -// Audio Endpoint Descriptor Subtypes -#define ENDPOINT_GENERAL 0x01 - -#endif
--- a/Drivers/USBDevice/USBDevice/USBDescriptor.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/* Standard descriptor types */ -#define DEVICE_DESCRIPTOR (1) -#define CONFIGURATION_DESCRIPTOR (2) -#define STRING_DESCRIPTOR (3) -#define INTERFACE_DESCRIPTOR (4) -#define ENDPOINT_DESCRIPTOR (5) -#define QUALIFIER_DESCRIPTOR (6) - -/* Standard descriptor lengths */ -#define DEVICE_DESCRIPTOR_LENGTH (0x12) -#define CONFIGURATION_DESCRIPTOR_LENGTH (0x09) -#define INTERFACE_DESCRIPTOR_LENGTH (0x09) -#define ENDPOINT_DESCRIPTOR_LENGTH (0x07) - - -/*string offset*/ -#define STRING_OFFSET_LANGID (0) -#define STRING_OFFSET_IMANUFACTURER (1) -#define STRING_OFFSET_IPRODUCT (2) -#define STRING_OFFSET_ISERIAL (3) -#define STRING_OFFSET_ICONFIGURATION (4) -#define STRING_OFFSET_IINTERFACE (5) - -/* USB Specification Release Number */ -#define USB_VERSION_2_0 (0x0200) - -/* Least/Most significant byte of short integer */ -#define LSB(n) ((n)&0xff) -#define MSB(n) (((n)&0xff00)>>8) - -/* Convert physical endpoint number to descriptor endpoint number */ -#define PHY_TO_DESC(endpoint) (((endpoint)>>1) | (((endpoint) & 1) ? 0x80:0)) - -/* bmAttributes in configuration descriptor */ -/* C_RESERVED must always be set */ -#define C_RESERVED (1U<<7) -#define C_SELF_POWERED (1U<<6) -#define C_REMOTE_WAKEUP (1U<<5) - -/* bMaxPower in configuration descriptor */ -#define C_POWER(mA) ((mA)/2) - -/* bmAttributes in endpoint descriptor */ -#define E_CONTROL (0x00) -#define E_ISOCHRONOUS (0x01) -#define E_BULK (0x02) -#define E_INTERRUPT (0x03) - -/* For isochronous endpoints only: */ -#define E_NO_SYNCHRONIZATION (0x00) -#define E_ASYNCHRONOUS (0x04) -#define E_ADAPTIVE (0x08) -#define E_SYNCHRONOUS (0x0C) -#define E_DATA (0x00) -#define E_FEEDBACK (0x10) -#define E_IMPLICIT_FEEDBACK (0x20)
--- a/Drivers/USBDevice/USBDevice/USBDevice.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1005 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-
-#include "USBEndpoints.h"
-#include "USBDevice.h"
-#include "USBDescriptor.h"
-
-//#define DEBUG
-
-/* Device status */
-#define DEVICE_STATUS_SELF_POWERED (1U<<0)
-#define DEVICE_STATUS_REMOTE_WAKEUP (1U<<1)
-
-/* Endpoint status */
-#define ENDPOINT_STATUS_HALT (1U<<0)
-
-/* Standard feature selectors */
-#define DEVICE_REMOTE_WAKEUP (1)
-#define ENDPOINT_HALT (0)
-
-/* Macro to convert wIndex endpoint number to physical endpoint number */
-#define WINDEX_TO_PHYSICAL(endpoint) (((endpoint & 0x0f) << 1) + \
- ((endpoint & 0x80) ? 1 : 0))
-
-
-bool USBDevice::requestGetDescriptor(void)
-{
- bool success = false;
-#ifdef DEBUG
- printf("get descr: type: %d\r\n", DESCRIPTOR_TYPE(transfer.setup.wValue));
-#endif
- switch (DESCRIPTOR_TYPE(transfer.setup.wValue))
- {
- case DEVICE_DESCRIPTOR:
- if (deviceDesc() != NULL)
- {
- if ((deviceDesc()[0] == DEVICE_DESCRIPTOR_LENGTH) \
- && (deviceDesc()[1] == DEVICE_DESCRIPTOR))
- {
-#ifdef DEBUG
- printf("device descr\r\n");
-#endif
- transfer.remaining = DEVICE_DESCRIPTOR_LENGTH;
- transfer.ptr = deviceDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- }
- }
- break;
- case CONFIGURATION_DESCRIPTOR:
- if (configurationDesc() != NULL)
- {
- if ((configurationDesc()[0] == CONFIGURATION_DESCRIPTOR_LENGTH) \
- && (configurationDesc()[1] == CONFIGURATION_DESCRIPTOR))
- {
-#ifdef DEBUG
- printf("conf descr request\r\n");
-#endif
- /* Get wTotalLength */
- transfer.remaining = configurationDesc()[2] \
- | (configurationDesc()[3] << 8);
-
- transfer.ptr = configurationDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- }
- }
- break;
- case STRING_DESCRIPTOR:
-#ifdef DEBUG
- printf("str descriptor\r\n");
-#endif
- switch (DESCRIPTOR_INDEX(transfer.setup.wValue))
- {
- case STRING_OFFSET_LANGID:
-#ifdef DEBUG
- printf("1\r\n");
-#endif
- transfer.remaining = stringLangidDesc()[0];
- transfer.ptr = stringLangidDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- break;
- case STRING_OFFSET_IMANUFACTURER:
-#ifdef DEBUG
- printf("2\r\n");
-#endif
- transfer.remaining = stringImanufacturerDesc()[0];
- transfer.ptr = stringImanufacturerDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- break;
- case STRING_OFFSET_IPRODUCT:
-#ifdef DEBUG
- printf("3\r\n");
-#endif
- transfer.remaining = stringIproductDesc()[0];
- transfer.ptr = stringIproductDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- break;
- case STRING_OFFSET_ISERIAL:
-#ifdef DEBUG
- printf("4\r\n");
-#endif
- transfer.remaining = stringIserialDesc()[0];
- transfer.ptr = stringIserialDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- break;
- case STRING_OFFSET_ICONFIGURATION:
-#ifdef DEBUG
- printf("5\r\n");
-#endif
- transfer.remaining = stringIConfigurationDesc()[0];
- transfer.ptr = stringIConfigurationDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- break;
- case STRING_OFFSET_IINTERFACE:
-#ifdef DEBUG
- printf("6\r\n");
-#endif
- transfer.remaining = stringIinterfaceDesc()[0];
- transfer.ptr = stringIinterfaceDesc();
- transfer.direction = DEVICE_TO_HOST;
- success = true;
- break;
- }
- break;
- case INTERFACE_DESCRIPTOR:
-#ifdef DEBUG
- printf("interface descr\r\n");
-#endif
- case ENDPOINT_DESCRIPTOR:
-#ifdef DEBUG
- printf("endpoint descr\r\n");
-#endif
- /* TODO: Support is optional, not implemented here */
- break;
- default:
-#ifdef DEBUG
- printf("ERROR\r\n");
-#endif
- break;
- }
-
- return success;
-}
-
-void USBDevice::decodeSetupPacket(uint8_t *data, SETUP_PACKET *packet)
-{
- /* Fill in the elements of a SETUP_PACKET structure from raw data */
- packet->bmRequestType.dataTransferDirection = (data[0] & 0x80) >> 7;
- packet->bmRequestType.Type = (data[0] & 0x60) >> 5;
- packet->bmRequestType.Recipient = data[0] & 0x1f;
- packet->bRequest = data[1];
- packet->wValue = (data[2] | (uint16_t)data[3] << 8);
- packet->wIndex = (data[4] | (uint16_t)data[5] << 8);
- packet->wLength = (data[6] | (uint16_t)data[7] << 8);
-}
-
-
-bool USBDevice::controlOut(void)
-{
- /* Control transfer data OUT stage */
- uint8_t buffer[MAX_PACKET_SIZE_EP0];
- uint32_t packetSize;
-
- /* Check we should be transferring data OUT */
- if (transfer.direction != HOST_TO_DEVICE)
- {
-#if defined(TARGET_KL25Z) | defined(TARGET_KL43Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D5M) | defined(TARGET_K64F) | defined(TARGET_K22F) | defined(TARGET_TEENSY3_1)
- /*
- * We seem to have a pending device-to-host transfer. The host must have
- * sent a new control request without waiting for us to finish processing
- * the previous one. This appears to happen when we're connected to certain
- * USB 3.0 host chip set. Do a zeor-length send to tell the host we're not
- * ready for the new request - that'll make it resend - and then just
- * pretend we were successful here so that the pending transfer can finish.
- */
- uint8_t buf[1] = { 0 };
- EP0write(buf, 0);
-
- /* execute our pending ttransfer */
- controlIn();
-
- /* indicate success */
- return true;
- #else
- /* for other platforms, count on the HAL to handle this case */
- return false;
- #endif
- }
-
- /* Read from endpoint */
- packetSize = EP0getReadResult(buffer);
-
- /* Check if transfer size is valid */
- if (packetSize > transfer.remaining)
- {
- /* Too big */
- return false;
- }
-
- /* Update transfer */
- transfer.ptr += packetSize;
- transfer.remaining -= packetSize;
-
- /* Check if transfer has completed */
- if (transfer.remaining == 0)
- {
- /* Transfer completed */
- if (transfer.notify)
- {
- /* Notify class layer. */
- USBCallback_requestCompleted(buffer, packetSize);
- transfer.notify = false;
- }
- /* Status stage */
- EP0write(NULL, 0);
- }
- else
- {
- EP0read();
- }
-
- return true;
-}
-
-bool USBDevice::controlIn(void)
-{
- /* Control transfer data IN stage */
- uint32_t packetSize;
-
- /* Check if transfer has completed (status stage transactions */
- /* also have transfer.remaining == 0) */
- if (transfer.remaining == 0)
- {
- if (transfer.zlp)
- {
- /* Send zero length packet */
- EP0write(NULL, 0);
- transfer.zlp = false;
- }
-
- /* Transfer completed */
- if (transfer.notify)
- {
- /* Notify class layer. */
- USBCallback_requestCompleted(NULL, 0);
- transfer.notify = false;
- }
-
- EP0read();
- EP0readStage();
-
- /* Completed */
- return true;
- }
-
- /* Check we should be transferring data IN */
- if (transfer.direction != DEVICE_TO_HOST)
- {
- return false;
- }
-
- packetSize = transfer.remaining;
-
- if (packetSize > MAX_PACKET_SIZE_EP0)
- {
- packetSize = MAX_PACKET_SIZE_EP0;
- }
-
- /* Write to endpoint */
- EP0write(transfer.ptr, packetSize);
-
- /* Update transfer */
- transfer.ptr += packetSize;
- transfer.remaining -= packetSize;
-
- return true;
-}
-
-bool USBDevice::requestSetAddress(void)
-{
- /* Set the device address */
- setAddress(transfer.setup.wValue);
-
- if (transfer.setup.wValue == 0)
- {
- device.state = DEFAULT;
- }
- else
- {
- device.state = ADDRESS;
- }
-
- return true;
-}
-
-bool USBDevice::requestSetConfiguration(void)
-{
-
- device.configuration = transfer.setup.wValue;
- /* Set the device configuration */
- if (device.configuration == 0)
- {
- /* Not configured */
- unconfigureDevice();
- device.state = ADDRESS;
- }
- else
- {
- if (USBCallback_setConfiguration(device.configuration))
- {
- /* Valid configuration */
- configureDevice();
- device.state = CONFIGURED;
- }
- else
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool USBDevice::requestGetConfiguration(void)
-{
- /* Send the device configuration */
- transfer.ptr = &device.configuration;
- transfer.remaining = sizeof(device.configuration);
- transfer.direction = DEVICE_TO_HOST;
- return true;
-}
-
-bool USBDevice::requestGetInterface(void)
-{
- /* Return the selected alternate setting for an interface */
-
- if (device.state != CONFIGURED)
- {
- return false;
- }
-
- /* Send the alternate setting */
- transfer.setup.wIndex = currentInterface;
- transfer.ptr = ¤tAlternate;
- transfer.remaining = sizeof(currentAlternate);
- transfer.direction = DEVICE_TO_HOST;
- return true;
-}
-
-bool USBDevice::requestSetInterface(void)
-{
- bool success = false;
- if(USBCallback_setInterface(transfer.setup.wIndex, transfer.setup.wValue))
- {
- success = true;
- currentInterface = transfer.setup.wIndex;
- currentAlternate = transfer.setup.wValue;
- }
- return success;
-}
-
-bool USBDevice::requestSetFeature()
-{
- bool success = false;
-
- if (device.state != CONFIGURED)
- {
- /* Endpoint or interface must be zero */
- if (transfer.setup.wIndex != 0)
- {
- return false;
- }
- }
-
- switch (transfer.setup.bmRequestType.Recipient)
- {
- case DEVICE_RECIPIENT:
- /* TODO: Remote wakeup feature not supported */
- break;
- case ENDPOINT_RECIPIENT:
- if (transfer.setup.wValue == ENDPOINT_HALT)
- {
- /* TODO: We should check that the endpoint number is valid */
- stallEndpoint(
- WINDEX_TO_PHYSICAL(transfer.setup.wIndex));
- success = true;
- }
- break;
- default:
- break;
- }
-
- return success;
-}
-
-bool USBDevice::requestClearFeature()
-{
- bool success = false;
-
- if (device.state != CONFIGURED)
- {
- /* Endpoint or interface must be zero */
- if (transfer.setup.wIndex != 0)
- {
- return false;
- }
- }
-
- switch (transfer.setup.bmRequestType.Recipient)
- {
- case DEVICE_RECIPIENT:
- /* TODO: Remote wakeup feature not supported */
- break;
- case ENDPOINT_RECIPIENT:
- /* TODO: We should check that the endpoint number is valid */
- if (transfer.setup.wValue == ENDPOINT_HALT)
- {
- unstallEndpoint( WINDEX_TO_PHYSICAL(transfer.setup.wIndex));
- success = true;
- }
- break;
- default:
- break;
- }
-
- return success;
-}
-
-bool USBDevice::requestGetStatus(void)
-{
- static uint16_t status;
- bool success = false;
-
- if (device.state != CONFIGURED)
- {
- /* Endpoint or interface must be zero */
- if (transfer.setup.wIndex != 0)
- {
- return false;
- }
- }
-
- switch (transfer.setup.bmRequestType.Recipient)
- {
- case DEVICE_RECIPIENT:
- /* TODO: Currently only supports self powered devices */
- status = DEVICE_STATUS_SELF_POWERED;
- success = true;
- break;
- case INTERFACE_RECIPIENT:
- status = 0;
- success = true;
- break;
- case ENDPOINT_RECIPIENT:
- /* TODO: We should check that the endpoint number is valid */
- if (getEndpointStallState(
- WINDEX_TO_PHYSICAL(transfer.setup.wIndex)))
- {
- status = ENDPOINT_STATUS_HALT;
- }
- else
- {
- status = 0;
- }
- success = true;
- break;
- default:
- break;
- }
-
- if (success)
- {
- /* Send the status */
- transfer.ptr = (uint8_t *)&status; /* Assumes little endian */
- transfer.remaining = sizeof(status);
- transfer.direction = DEVICE_TO_HOST;
- }
-
- return success;
-}
-
-bool USBDevice::requestSetup(void)
-{
- bool success = false;
-
- /* Process standard requests */
- if ((transfer.setup.bmRequestType.Type == STANDARD_TYPE))
- {
- switch (transfer.setup.bRequest)
- {
- case GET_STATUS:
- success = requestGetStatus();
- break;
- case CLEAR_FEATURE:
- success = requestClearFeature();
- break;
- case SET_FEATURE:
- success = requestSetFeature();
- break;
- case SET_ADDRESS:
- success = requestSetAddress();
- break;
- case GET_DESCRIPTOR:
- success = requestGetDescriptor();
- break;
- case SET_DESCRIPTOR:
- /* TODO: Support is optional, not implemented here */
- success = false;
- break;
- case GET_CONFIGURATION:
- success = requestGetConfiguration();
- break;
- case SET_CONFIGURATION:
- success = requestSetConfiguration();
- break;
- case GET_INTERFACE:
- success = requestGetInterface();
- break;
- case SET_INTERFACE:
- success = requestSetInterface();
- break;
- default:
- break;
- }
- }
-
- return success;
-}
-
-bool USBDevice::controlSetup(void)
-{
- bool success = false;
-
- /* Control transfer setup stage */
- uint8_t buffer[MAX_PACKET_SIZE_EP0];
-
- EP0setup(buffer);
-
- /* Initialise control transfer state */
- decodeSetupPacket(buffer, &transfer.setup);
- transfer.ptr = NULL;
- transfer.remaining = 0;
- transfer.direction = 0;
- transfer.zlp = false;
- transfer.notify = false;
-
-#ifdef DEBUG
- printf("dataTransferDirection: %d\r\nType: %d\r\nRecipient: %d\r\nbRequest: %d\r\nwValue: %d\r\nwIndex: %d\r\nwLength: %d\r\n",transfer.setup.bmRequestType.dataTransferDirection,
- transfer.setup.bmRequestType.Type,
- transfer.setup.bmRequestType.Recipient,
- transfer.setup.bRequest,
- transfer.setup.wValue,
- transfer.setup.wIndex,
- transfer.setup.wLength);
-#endif
-
- /* Class / vendor specific */
- success = USBCallback_request();
-
- if (!success)
- {
- /* Standard requests */
- if (!requestSetup())
- {
-#ifdef DEBUG
- printf("fail!!!!\r\n");
-#endif
- return false;
- }
- }
-
- /* Check transfer size and direction */
- if (transfer.setup.wLength>0)
- {
- if (transfer.setup.bmRequestType.dataTransferDirection \
- == DEVICE_TO_HOST)
- {
- /* IN data stage is required */
- if (transfer.direction != DEVICE_TO_HOST)
- {
- return false;
- }
-
- /* Transfer must be less than or equal to the size */
- /* requested by the host */
- if (transfer.remaining > transfer.setup.wLength)
- {
- transfer.remaining = transfer.setup.wLength;
- }
- }
- else
- {
-
- /* OUT data stage is required */
- if (transfer.direction != HOST_TO_DEVICE)
- {
- return false;
- }
-
- /* Transfer must be equal to the size requested by the host */
- if (transfer.remaining != transfer.setup.wLength)
- {
- return false;
- }
- }
- }
- else
- {
- /* No data stage; transfer size must be zero */
- if (transfer.remaining != 0)
- {
- return false;
- }
- }
-
- /* Data or status stage if applicable */
- if (transfer.setup.wLength>0)
- {
- if (transfer.setup.bmRequestType.dataTransferDirection \
- == DEVICE_TO_HOST)
- {
- /* Check if we'll need to send a zero length packet at */
- /* the end of this transfer */
- if (transfer.setup.wLength > transfer.remaining)
- {
- /* Device wishes to transfer less than host requested */
- if ((transfer.remaining % MAX_PACKET_SIZE_EP0) == 0)
- {
- /* Transfer is a multiple of EP0 max packet size */
- transfer.zlp = true;
- }
- }
-
- /* IN stage */
- controlIn();
- }
- else
- {
- /* OUT stage */
- EP0read();
- }
- }
- else
- {
- /* Status stage */
- EP0write(NULL, 0);
- }
-
- return true;
-}
-
-void USBDevice::busReset(void)
-{
- device.state = DEFAULT;
- device.configuration = 0;
- device.suspended = false;
-
- /* Call class / vendor specific busReset function */
- USBCallback_busReset();
-}
-
-void USBDevice::EP0setupCallback(void)
-{
- /* Endpoint 0 setup event */
- if (!controlSetup())
- {
- /* Protocol stall */
- EP0stall();
- }
-
- /* Return true if an OUT data stage is expected */
-}
-
-void USBDevice::EP0out(void)
-{
- /* Endpoint 0 OUT data event */
- if (!controlOut())
- {
- /* Protocol stall; this will stall both endpoints */
- EP0stall();
- }
-}
-
-void USBDevice::EP0in(void)
-{
-#ifdef DEBUG
- printf("EP0IN\r\n");
-#endif
- /* Endpoint 0 IN data event */
- if (!controlIn())
- {
- /* Protocol stall; this will stall both endpoints */
- EP0stall();
- }
-}
-
-bool USBDevice::configured(void)
-{
- /* Returns true if device is in the CONFIGURED state */
- return (device.state == CONFIGURED);
-}
-
-void USBDevice::connect(bool blocking)
-{
- /* Connect device */
- USBHAL::connect();
-
- if (blocking) {
- /* Block if not configured */
- while (!configured());
- }
-}
-
-void USBDevice::disconnect(void)
-{
- /* Disconnect device */
- USBHAL::disconnect();
-
- /* Set initial device state */
- device.state = POWERED;
- device.configuration = 0;
- device.suspended = false;
-}
-
-CONTROL_TRANSFER * USBDevice::getTransferPtr(void)
-{
- return &transfer;
-}
-
-bool USBDevice::addEndpoint(uint8_t endpoint, uint32_t maxPacket)
-{
- return realiseEndpoint(endpoint, maxPacket, 0);
-}
-
-bool USBDevice::addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket)
-{
- /* For interrupt endpoints only */
- return realiseEndpoint(endpoint, maxPacket, RATE_FEEDBACK_MODE);
-}
-
-uint8_t * USBDevice::findDescriptor(uint8_t descriptorType)
-{
- /* Find a descriptor within the list of descriptors */
- /* following a configuration descriptor. */
- uint16_t wTotalLength;
- uint8_t *ptr;
-
- if (configurationDesc() == NULL)
- {
- return NULL;
- }
-
- /* Check this is a configuration descriptor */
- if ((configurationDesc()[0] != CONFIGURATION_DESCRIPTOR_LENGTH) \
- || (configurationDesc()[1] != CONFIGURATION_DESCRIPTOR))
- {
- return NULL;
- }
-
- wTotalLength = configurationDesc()[2] | (configurationDesc()[3] << 8);
-
- /* Check there are some more descriptors to follow */
- if (wTotalLength <= (CONFIGURATION_DESCRIPTOR_LENGTH+2))
- /* +2 is for bLength and bDescriptorType of next descriptor */
- {
- return NULL;
- }
-
- /* Start at first descriptor after the configuration descriptor */
- ptr = &(configurationDesc()[CONFIGURATION_DESCRIPTOR_LENGTH]);
-
- do {
- if (ptr[1] /* bDescriptorType */ == descriptorType)
- {
- /* Found */
- return ptr;
- }
-
- /* Skip to next descriptor */
- ptr += ptr[0]; /* bLength */
- } while (ptr < (configurationDesc() + wTotalLength));
-
- /* Reached end of the descriptors - not found */
- return NULL;
-}
-
-
-void USBDevice::connectStateChanged(unsigned int connected)
-{
-}
-
-void USBDevice::suspendStateChanged(unsigned int suspended)
-{
-}
-
-
-USBDevice::USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release){
- VENDOR_ID = vendor_id;
- PRODUCT_ID = product_id;
- PRODUCT_RELEASE = product_release;
-
- /* Set initial device state */
- device.state = POWERED;
- device.configuration = 0;
- device.suspended = false;
-};
-
-
-bool USBDevice::readStart(uint8_t endpoint, uint32_t maxSize)
-{
- return endpointRead(endpoint, maxSize) == EP_PENDING;
-}
-
-
-bool USBDevice::write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize)
-{
- EP_STATUS result;
-
- if (size > maxSize)
- {
- return false;
- }
-
-
- if(!configured()) {
- return false;
- }
-
- /* Send report */
- result = endpointWrite(endpoint, buffer, size);
-
- if (result != EP_PENDING)
- {
- return false;
- }
-
- /* Wait for completion */
- do {
- result = endpointWriteResult(endpoint);
- } while ((result == EP_PENDING) && configured());
-
- return (result == EP_COMPLETED);
-}
-
-
-bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize)
-{
- EP_STATUS result;
-
- if (size > maxSize)
- {
- return false;
- }
-
- if(!configured()) {
- return false;
- }
-
- /* Send report */
- result = endpointWrite(endpoint, buffer, size);
-
- if (result != EP_PENDING)
- {
- return false;
- }
-
- result = endpointWriteResult(endpoint);
-
- return (result == EP_COMPLETED);
-}
-
-
-
-bool USBDevice::readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
-{
- EP_STATUS result;
-
- if(!configured()) {
- return false;
- }
-
- /* Wait for completion */
- do {
- result = endpointReadResult(endpoint, buffer, size);
- } while ((result == EP_PENDING) && configured());
-
- return (result == EP_COMPLETED);
-}
-
-
-bool USBDevice::readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
-{
- EP_STATUS result;
-
- if(!configured()) {
- return false;
- }
-
- result = endpointReadResult(endpoint, buffer, size);
-
- return (result == EP_COMPLETED);
-}
-
-
-
-uint8_t * USBDevice::deviceDesc() {
- static uint8_t deviceDescriptor[] = {
- DEVICE_DESCRIPTOR_LENGTH, /* bLength */
- DEVICE_DESCRIPTOR, /* bDescriptorType */
- LSB(USB_VERSION_2_0), /* bcdUSB (LSB) */
- MSB(USB_VERSION_2_0), /* bcdUSB (MSB) */
- 0x00, /* bDeviceClass */
- 0x00, /* bDeviceSubClass */
- 0x00, /* bDeviceprotocol */
- MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */
- (uint8_t)(LSB(VENDOR_ID)), /* idVendor (LSB) */
- (uint8_t)(MSB(VENDOR_ID)), /* idVendor (MSB) */
- (uint8_t)(LSB(PRODUCT_ID)), /* idProduct (LSB) */
- (uint8_t)(MSB(PRODUCT_ID)), /* idProduct (MSB) */
- (uint8_t)(LSB(PRODUCT_RELEASE)), /* bcdDevice (LSB) */
- (uint8_t)(MSB(PRODUCT_RELEASE)), /* bcdDevice (MSB) */
- STRING_OFFSET_IMANUFACTURER, /* iManufacturer */
- STRING_OFFSET_IPRODUCT, /* iProduct */
- STRING_OFFSET_ISERIAL, /* iSerialNumber */
- 0x01 /* bNumConfigurations */
- };
- return deviceDescriptor;
-}
-
-uint8_t * USBDevice::stringLangidDesc() {
- static uint8_t stringLangidDescriptor[] = {
- 0x04, /*bLength*/
- STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
- 0x09,0x04, /*bString Lang ID - 0x0409 - English*/
- };
- return stringLangidDescriptor;
-}
-
-uint8_t * USBDevice::stringImanufacturerDesc() {
- static uint8_t stringImanufacturerDescriptor[] = {
- 0x12, /*bLength*/
- STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
- 'm',0,'b',0,'e',0,'d',0,'.',0,'o',0,'r',0,'g',0, /*bString iManufacturer - mbed.org*/
- };
- return stringImanufacturerDescriptor;
-}
-
-uint8_t * USBDevice::stringIserialDesc() {
- static uint8_t stringIserialDescriptor[] = {
- 0x16, /*bLength*/
- STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
- '0',0,'1',0,'2',0,'3',0,'4',0,'5',0,'6',0,'7',0,'8',0,'9',0, /*bString iSerial - 0123456789*/
- };
- return stringIserialDescriptor;
-}
-
-uint8_t * USBDevice::stringIConfigurationDesc() {
- static uint8_t stringIconfigurationDescriptor[] = {
- 0x06, /*bLength*/
- STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
- '0',0,'1',0, /*bString iConfiguration - 01*/
- };
- return stringIconfigurationDescriptor;
-}
-
-uint8_t * USBDevice::stringIinterfaceDesc() {
- static uint8_t stringIinterfaceDescriptor[] = {
- 0x08, /*bLength*/
- STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
- 'U',0,'S',0,'B',0, /*bString iInterface - USB*/
- };
- return stringIinterfaceDescriptor;
-}
-
-uint8_t * USBDevice::stringIproductDesc() {
- static uint8_t stringIproductDescriptor[] = {
- 0x16, /*bLength*/
- STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
- 'U',0,'S',0,'B',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 /*bString iProduct - USB DEVICE*/
- };
- return stringIproductDescriptor;
-}
--- a/Drivers/USBDevice/USBDevice/USBDevice.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBDEVICE_H
-#define USBDEVICE_H
-
-#include "mbed.h"
-#include "USBDevice_Types.h"
-#include "USBHAL.h"
-
-class USBDevice: public USBHAL
-{
-public:
- USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);
-
- /*
- * Check if the device is configured
- *
- * @returns true if configured, false otherwise
- */
- bool configured(void);
-
- /*
- * Connect a device
- *
- * @param blocking: block if not configured
- */
- void connect(bool blocking = true);
-
- /*
- * Disconnect a device
- */
- void disconnect(void);
-
- /*
- * Add an endpoint
- *
- * @param endpoint endpoint which will be added
- * @param maxPacket Maximum size of a packet which can be sent for this endpoint
- * @returns true if successful, false otherwise
- */
- bool addEndpoint(uint8_t endpoint, uint32_t maxPacket);
-
- /*
- * Start a reading on a certain endpoint.
- * You can access the result of the reading by USBDevice_read
- *
- * @param endpoint endpoint which will be read
- * @param maxSize the maximum length that can be read
- * @return true if successful
- */
- bool readStart(uint8_t endpoint, uint32_t maxSize);
-
- /*
- * Read a certain endpoint. Before calling this function, USBUSBDevice_readStart
- * must be called.
- *
- * Warning: blocking
- *
- * @param endpoint endpoint which will be read
- * @param buffer buffer will be filled with the data received
- * @param size the number of bytes read will be stored in *size
- * @param maxSize the maximum length that can be read
- * @returns true if successful
- */
- bool readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
-
- /*
- * Read a certain endpoint.
- *
- * Warning: non blocking
- *
- * @param endpoint endpoint which will be read
- * @param buffer buffer will be filled with the data received (if data are available)
- * @param size the number of bytes read will be stored in *size
- * @param maxSize the maximum length that can be read
- * @returns true if successful
- */
- bool readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
-
- /*
- * Write a certain endpoint.
- *
- * Warning: blocking
- *
- * @param endpoint endpoint to write
- * @param buffer data contained in buffer will be write
- * @param size the number of bytes to write
- * @param maxSize the maximum length that can be written on this endpoint
- */
- bool write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize);
-
-
- /*
- * Write a certain endpoint.
- *
- * Warning: non blocking
- *
- * @param endpoint endpoint to write
- * @param buffer data contained in buffer will be write
- * @param size the number of bytes to write
- * @param maxSize the maximum length that can be written on this endpoint
- */
- bool writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize);
-
-
- /*
- * Called by USBDevice layer on bus reset. Warning: Called in ISR context
- *
- * May be used to reset state
- */
- virtual void USBCallback_busReset(void) {};
-
- /*
- * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
- * This is used to handle extensions to standard requests
- * and class specific requests
- *
- * @returns true if class handles this request
- */
- virtual bool USBCallback_request() { return false; };
-
- /*
- * Called by USBDevice on Endpoint0 request completion
- * if the 'notify' flag has been set to true. Warning: Called in ISR context
- *
- * In this case it is used to indicate that a HID report has
- * been received from the host on endpoint 0
- *
- * @param buf buffer received on endpoint 0
- * @param length length of this buffer
- */
- virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {};
-
- /*
- * Called by USBDevice layer. Set configuration of the device.
- * For instance, you can add all endpoints that you need on this function.
- *
- * @param configuration Number of the configuration
- */
- virtual bool USBCallback_setConfiguration(uint8_t configuration) { return false; };
-
- /*
- * Called by USBDevice layer. Set interface/alternate of the device.
- *
- * @param interface Number of the interface to be configured
- * @param alternate Number of the alternate to be configured
- * @returns true if class handles this request
- */
- virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate) { return false; };
-
- /*
- * Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
- *
- * @returns pointer to the device descriptor
- */
- virtual uint8_t * deviceDesc();
-
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc(){return NULL;};
-
- /*
- * Get string lang id descriptor
- *
- * @return pointer to the string lang id descriptor
- */
- virtual uint8_t * stringLangidDesc();
-
- /*
- * Get string manufacturer descriptor
- *
- * @returns pointer to the string manufacturer descriptor
- */
- virtual uint8_t * stringImanufacturerDesc();
-
- /*
- * Get string product descriptor
- *
- * @returns pointer to the string product descriptor
- */
- virtual uint8_t * stringIproductDesc();
-
- /*
- * Get string serial descriptor
- *
- * @returns pointer to the string serial descriptor
- */
- virtual uint8_t * stringIserialDesc();
-
- /*
- * Get string configuration descriptor
- *
- * @returns pointer to the string configuration descriptor
- */
- virtual uint8_t * stringIConfigurationDesc();
-
- /*
- * Get string interface descriptor
- *
- * @returns pointer to the string interface descriptor
- */
- virtual uint8_t * stringIinterfaceDesc();
-
- /*
- * Get the length of the report descriptor
- *
- * @returns length of the report descriptor
- */
- virtual uint16_t reportDescLength() { return 0; };
-
-
-
-protected:
- virtual void busReset(void);
- virtual void EP0setupCallback(void);
- virtual void EP0out(void);
- virtual void EP0in(void);
- virtual void connectStateChanged(unsigned int connected);
- virtual void suspendStateChanged(unsigned int suspended);
- uint8_t * findDescriptor(uint8_t descriptorType);
- CONTROL_TRANSFER * getTransferPtr(void);
-
- uint16_t VENDOR_ID;
- uint16_t PRODUCT_ID;
- uint16_t PRODUCT_RELEASE;
-
-private:
- bool addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket);
- bool requestGetDescriptor(void);
- bool controlOut(void);
- bool controlIn(void);
- bool requestSetAddress(void);
- bool requestSetConfiguration(void);
- bool requestSetFeature(void);
- bool requestClearFeature(void);
- bool requestGetStatus(void);
- bool requestSetup(void);
- bool controlSetup(void);
- void decodeSetupPacket(uint8_t *data, SETUP_PACKET *packet);
- bool requestGetConfiguration(void);
- bool requestGetInterface(void);
- bool requestSetInterface(void);
-
- CONTROL_TRANSFER transfer;
- USB_DEVICE device;
-
- uint16_t currentInterface;
- uint8_t currentAlternate;
-};
-
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBDevice_Types.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBDEVICE_TYPES_H
-#define USBDEVICE_TYPES_H
-
-#include <stdint.h>
-
-/* Standard requests */
-#define GET_STATUS (0)
-#define CLEAR_FEATURE (1)
-#define SET_FEATURE (3)
-#define SET_ADDRESS (5)
-#define GET_DESCRIPTOR (6)
-#define SET_DESCRIPTOR (7)
-#define GET_CONFIGURATION (8)
-#define SET_CONFIGURATION (9)
-#define GET_INTERFACE (10)
-#define SET_INTERFACE (11)
-
-/* bmRequestType.dataTransferDirection */
-#define HOST_TO_DEVICE (0)
-#define DEVICE_TO_HOST (1)
-
-/* bmRequestType.Type*/
-#define STANDARD_TYPE (0)
-#define CLASS_TYPE (1)
-#define VENDOR_TYPE (2)
-#define RESERVED_TYPE (3)
-
-/* bmRequestType.Recipient */
-#define DEVICE_RECIPIENT (0)
-#define INTERFACE_RECIPIENT (1)
-#define ENDPOINT_RECIPIENT (2)
-#define OTHER_RECIPIENT (3)
-
-/* Descriptors */
-#define DESCRIPTOR_TYPE(wValue) (wValue >> 8)
-#define DESCRIPTOR_INDEX(wValue) (wValue & 0xff)
-
-typedef struct {
- struct {
- uint8_t dataTransferDirection;
- uint8_t Type;
- uint8_t Recipient;
- } bmRequestType;
- uint8_t bRequest;
- uint16_t wValue;
- uint16_t wIndex;
- uint16_t wLength;
-} SETUP_PACKET;
-
-typedef struct {
- SETUP_PACKET setup;
- uint8_t *ptr;
- uint32_t remaining;
- uint8_t direction;
- bool zlp;
- bool notify;
-} CONTROL_TRANSFER;
-
-typedef enum {ATTACHED, POWERED, DEFAULT, ADDRESS, CONFIGURED} DEVICE_STATE;
-
-typedef struct {
- volatile DEVICE_STATE state;
- uint8_t configuration;
- bool suspended;
-} USB_DEVICE;
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBEndpoints.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBENDPOINTS_H
-#define USBENDPOINTS_H
-
-/* SETUP packet size */
-#define SETUP_PACKET_SIZE (8)
-
-/* Options flags for configuring endpoints */
-#define DEFAULT_OPTIONS (0)
-#define SINGLE_BUFFERED (1U << 0)
-#define ISOCHRONOUS (1U << 1)
-#define RATE_FEEDBACK_MODE (1U << 2) /* Interrupt endpoints only */
-
-/* Endpoint transfer status, for endpoints > 0 */
-typedef enum {
- EP_COMPLETED, /* Transfer completed */
- EP_PENDING, /* Transfer in progress */
- EP_INVALID, /* Invalid parameter */
- EP_STALLED, /* Endpoint stalled */
-} EP_STATUS;
-
-/* Include configuration for specific target */
-#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) || defined(TARGET_LPC2460) || defined(TARGET_LPC4088_DM)
-#include "USBEndpoints_LPC17_LPC23.h"
-#elif defined(TARGET_LPC11UXX) || defined(TARGET_LPC1347) || defined (TARGET_LPC11U6X) || defined (TARGET_LPC1549)
-#include "USBEndpoints_LPC11U.h"
-#elif defined(TARGET_KL25Z) | defined(TARGET_KL26Z) | defined(TARGET_KL27Z) | defined(TARGET_KL43Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D50M) | defined(TARGET_K64F) | defined(TARGET_K22F) | defined(TARGET_TEENSY3_1)
-#include "USBEndpoints_KL25Z.h"
-#elif defined (TARGET_STM32F4)
-#include "USBEndpoints_STM32F4.h"
-#elif defined (TARGET_RZ_A1H) || defined (TARGET_VK_RZ_A1H)
-#include "USBEndpoints_RZ_A1H.h"
-#elif defined(TARGET_Maxim)
-#include "USBEndpoints_Maxim.h"
-#elif defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32WG_STK3800) || defined(TARGET_EFM32HG_STK3400)
-#include "USBEndpoints_EFM32.h"
-#else
-#error "Unknown target type"
-#endif
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_EFM32.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ - -#ifndef TARGET_EFM32HG_STK3400 -# define NUMBER_OF_LOGICAL_ENDPOINTS (6) -#else -# define NUMBER_OF_LOGICAL_ENDPOINTS (3) -#endif - -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) -#define NUMBER_OF_ENDPOINTS (NUMBER_OF_PHYSICAL_ENDPOINTS + 2) /* Includes EP0 */ - -#define EP0OUT (0) -#define EP0IN (1) -#define EP1OUT (2) -#define EP1IN (3) -#define EP2OUT (4) -#define EP2IN (5) -#define EP3OUT (6) -#define EP3IN (7) -#ifndef TARGET_EFM32HG_STK3400 -# define EP4OUT (8) -# define EP4IN (9) -# define EP5OUT (10) -# define EP5IN (11) -# define EP6OUT (12) -# define EP6IN (13) -#endif - -#define USB_EP_TO_INDEX(ep) (ep) -#define USB_EP_TO_ADDR(ep) (((ep)>>1) | (((ep) & 1 ) ? 0x80 : 0x00)) -#define USB_ADDR_TO_EP(ep) (((ep)<<1) | (((ep) & 0x80) ? 0x01 : 0x00)) - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 64 -#define MAX_PACKET_SIZE_EP1 64 -#define MAX_PACKET_SIZE_EP2 64 -#define MAX_PACKET_SIZE_EP3 64 -#ifndef TARGET_EFM32HG_STK3400 -# define MAX_PACKET_SIZE_EP4 64 -# define MAX_PACKET_SIZE_EP5 64 -# define MAX_PACKET_SIZE_EP6 64 -#endif - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoints */ -#define EPBULK_OUT EP2OUT -#define EPBULK_IN EP2IN -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoints */ -#define EPINT_OUT EP1OUT -#define EPINT_IN EP1IN -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoints */ -#define EPISO_OUT EP3OUT -#define EPISO_IN EP3IN -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK 64 -#define MAX_PACKET_SIZE_EPINT 64 -#define MAX_PACKET_SIZE_EPISO 1023
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_KL25Z.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#define NUMBER_OF_LOGICAL_ENDPOINTS (16) -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) - -/* Define physical endpoint numbers */ - -/* Endpoint No. */ -/* ---------------- */ -#define EP0OUT (0) -#define EP0IN (1) -#define EP1OUT (2) -#define EP1IN (3) -#define EP2OUT (4) -#define EP2IN (5) -#define EP3OUT (6) -#define EP3IN (7) -#define EP4OUT (8) -#define EP4IN (9) -#define EP5OUT (10) -#define EP5IN (11) -#define EP6OUT (12) -#define EP6IN (13) -#define EP7OUT (14) -#define EP7IN (15) -#define EP8OUT (16) -#define EP8IN (17) -#define EP9OUT (18) -#define EP9IN (19) -#define EP10OUT (20) -#define EP10IN (21) -#define EP11OUT (22) -#define EP11IN (23) -#define EP12OUT (24) -#define EP12IN (25) -#define EP13OUT (26) -#define EP13IN (27) -#define EP14OUT (28) -#define EP14IN (29) -#define EP15OUT (30) -#define EP15IN (31) - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 (64) -#define MAX_PACKET_SIZE_EP1 (64) -#define MAX_PACKET_SIZE_EP2 (64) -#define MAX_PACKET_SIZE_EP3 (1023) -#define MAX_PACKET_SIZE_EP4 (64) -#define MAX_PACKET_SIZE_EP5 (64) -#define MAX_PACKET_SIZE_EP6 (64) -#define MAX_PACKET_SIZE_EP7 (64) -#define MAX_PACKET_SIZE_EP8 (64) -#define MAX_PACKET_SIZE_EP9 (64) -#define MAX_PACKET_SIZE_EP10 (64) -#define MAX_PACKET_SIZE_EP11 (64) -#define MAX_PACKET_SIZE_EP12 (64) -#define MAX_PACKET_SIZE_EP13 (64) -#define MAX_PACKET_SIZE_EP14 (64) -#define MAX_PACKET_SIZE_EP15 (64) - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoints */ -#define EPBULK_OUT (EP2OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoints */ -#define EPINT_OUT (EP1OUT) -#define EPINT_IN (EP1IN) -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoints */ -#define EPISO_OUT (EP3OUT) -#define EPISO_IN (EP3IN) -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) -#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) -#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3)
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_LPC11U.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#define NUMBER_OF_LOGICAL_ENDPOINTS (5) -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) - -/* Define physical endpoint numbers */ - -/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ -/* ---------------- ------------ ---------- --- */ -#define EP0OUT (0) /* Control 64 No */ -#define EP0IN (1) /* Control 64 No */ -#define EP1OUT (2) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP1IN (3) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP2OUT (4) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP2IN (5) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP3OUT (6) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP3IN (7) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP4OUT (8) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP4IN (9) /* Int/Bulk/Iso 64/64/1023 Yes */ - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 (64) -#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */ -#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */ -#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */ -#define MAX_PACKET_SIZE_EP4 (64) /* Int/Bulk */ - -#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */ -#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */ -#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */ -#define MAX_PACKET_SIZE_EP4_ISO (1023) /* Isochronous */ - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoint */ -#define EPBULK_OUT (EP2OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoint */ -#define EPINT_OUT (EP1OUT) -#define EPINT_IN (EP1IN) -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoint */ -#define EPISO_OUT (EP3OUT) -#define EPISO_IN (EP3IN) -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) -#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) -#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3_ISO)
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_LPC17_LPC23.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#define NUMBER_OF_LOGICAL_ENDPOINTS (16) -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) - -/* Define physical endpoint numbers */ - -/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ -/* ---------------- ------------ ---------- --- */ -#define EP0OUT (0) /* Control 64 No */ -#define EP0IN (1) /* Control 64 No */ -#define EP1OUT (2) /* Interrupt 64 No */ -#define EP1IN (3) /* Interrupt 64 No */ -#define EP2OUT (4) /* Bulk 64 Yes */ -#define EP2IN (5) /* Bulk 64 Yes */ -#define EP3OUT (6) /* Isochronous 1023 Yes */ -#define EP3IN (7) /* Isochronous 1023 Yes */ -#define EP4OUT (8) /* Interrupt 64 No */ -#define EP4IN (9) /* Interrupt 64 No */ -#define EP5OUT (10) /* Bulk 64 Yes */ -#define EP5IN (11) /* Bulk 64 Yes */ -#define EP6OUT (12) /* Isochronous 1023 Yes */ -#define EP6IN (13) /* Isochronous 1023 Yes */ -#define EP7OUT (14) /* Interrupt 64 No */ -#define EP7IN (15) /* Interrupt 64 No */ -#define EP8OUT (16) /* Bulk 64 Yes */ -#define EP8IN (17) /* Bulk 64 Yes */ -#define EP9OUT (18) /* Isochronous 1023 Yes */ -#define EP9IN (19) /* Isochronous 1023 Yes */ -#define EP10OUT (20) /* Interrupt 64 No */ -#define EP10IN (21) /* Interrupt 64 No */ -#define EP11OUT (22) /* Bulk 64 Yes */ -#define EP11IN (23) /* Bulk 64 Yes */ -#define EP12OUT (24) /* Isochronous 1023 Yes */ -#define EP12IN (25) /* Isochronous 1023 Yes */ -#define EP13OUT (26) /* Interrupt 64 No */ -#define EP13IN (27) /* Interrupt 64 No */ -#define EP14OUT (28) /* Bulk 64 Yes */ -#define EP14IN (29) /* Bulk 64 Yes */ -#define EP15OUT (30) /* Bulk 64 Yes */ -#define EP15IN (31) /* Bulk 64 Yes */ - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 (64) -#define MAX_PACKET_SIZE_EP1 (64) -#define MAX_PACKET_SIZE_EP2 (64) -#define MAX_PACKET_SIZE_EP3 (1023) -#define MAX_PACKET_SIZE_EP4 (64) -#define MAX_PACKET_SIZE_EP5 (64) -#define MAX_PACKET_SIZE_EP6 (1023) -#define MAX_PACKET_SIZE_EP7 (64) -#define MAX_PACKET_SIZE_EP8 (64) -#define MAX_PACKET_SIZE_EP9 (1023) -#define MAX_PACKET_SIZE_EP10 (64) -#define MAX_PACKET_SIZE_EP11 (64) -#define MAX_PACKET_SIZE_EP12 (1023) -#define MAX_PACKET_SIZE_EP13 (64) -#define MAX_PACKET_SIZE_EP14 (64) -#define MAX_PACKET_SIZE_EP15 (64) - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoints */ -#define EPBULK_OUT (EP2OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoints */ -#define EPINT_OUT (EP1OUT) -#define EPINT_IN (EP1IN) -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoints */ -#define EPISO_OUT (EP3OUT) -#define EPISO_IN (EP3IN) -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) -#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) -#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3)
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_Maxim.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES - * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the name of Maxim Integrated - * Products, Inc. shall not be used except as stated in the Maxim Integrated - * Products, Inc. Branding Policy. - * - * The mere transfer of this software does not imply any licenses - * of trade secrets, proprietary technology, copyrights, patents, - * trademarks, maskwork rights, or any other form of intellectual - * property whatsoever. Maxim Integrated Products, Inc. retains all - * ownership rights. - ******************************************************************************* - */ - -#define NUMBER_OF_LOGICAL_ENDPOINTS (8) -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) - -#define DIR_OUT 0x00 -#define DIR_IN 0x01 -#define EP_NUM(ep) (ep >> 1) -#define IN_EP(ep) (ep & DIR_IN) -#define OUT_EP(ep) (!(ep & DIR_IN)) - -/* Define physical endpoint numbers */ - -/* Endpoint No. */ -/* ---------------- */ -#define EP0OUT ((0 << 1) | DIR_OUT) -#define EP0IN ((0 << 1) | DIR_IN) -#define EP1OUT ((1 << 1) | DIR_OUT) -#define EP1IN ((1 << 1) | DIR_IN) -#define EP2OUT ((2 << 1) | DIR_OUT) -#define EP2IN ((2 << 1) | DIR_IN) -#define EP3OUT ((3 << 1) | DIR_OUT) -#define EP3IN ((3 << 1) | DIR_IN) -#define EP4OUT ((4 << 1) | DIR_OUT) -#define EP4IN ((4 << 1) | DIR_IN) -#define EP5OUT ((5 << 1) | DIR_OUT) -#define EP5IN ((5 << 1) | DIR_IN) -#define EP6OUT ((6 << 1) | DIR_OUT) -#define EP6IN ((6 << 1) | DIR_IN) -#define EP7OUT ((7 << 1) | DIR_OUT) -#define EP7IN ((7 << 1) | DIR_IN) - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 (64) -#define MAX_PACKET_SIZE_EP1 (64) -#define MAX_PACKET_SIZE_EP2 (64) -#define MAX_PACKET_SIZE_EP3 (64) -#define MAX_PACKET_SIZE_EP4 (64) -#define MAX_PACKET_SIZE_EP5 (64) -#define MAX_PACKET_SIZE_EP6 (64) -#define MAX_PACKET_SIZE_EP7 (64) - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoints */ -#define EPBULK_OUT (EP1OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP1_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoints */ -#define EPINT_OUT (EP3OUT) -#define EPINT_IN (EP4IN) -#define EPINT_OUT_callback EP3_OUT_callback -#define EPINT_IN_callback EP4_IN_callback -/* Isochronous endpoints */ -/* NOT SUPPORTED - use invalid endpoint number to prevent built errors */ -#define EPISO_OUT (EP0OUT) -#define EPISO_IN (EP0IN) - -#define MAX_PACKET_SIZE_EPBULK (64) -#define MAX_PACKET_SIZE_EPINT (64)
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_RZ_A1H.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#define NUMBER_OF_LOGICAL_ENDPOINTS (16) -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) - -/* Define physical endpoint numbers */ - -/* Endpoint No. Type(s) MaxSiz DoubleBuf pipe */ -/* ---------------- --------- ------ --------- ---- */ -#define EP0OUT (0) /* Control 256 No 0 */ -#define EP0IN (1) /* Control 256 No 0 */ -#define EP1OUT (2) /* Int 64 No 6 */ -#define EP1IN (3) /* Int 64 No 7 */ -#define EP2OUT (4) /* Bulk 2048 Yes 3 */ -#define EP2IN (5) /* Bulk 2048 Yes 4 */ -#define EP3OUT (6) /* Bulk/Iso 2048 Yes 1 */ -#define EP3IN (7) /* Bulk/Iso 2048 Yes 2 */ -/*following EP is not configured in sample program*/ -#define EP6IN (8) /* Bulk 2048 Yes 5 */ -#define EP8IN (9) /* Int 64 No 8 */ -#define EP9IN (10) /* Bulk 512 Bulk 9 */ -#define EP10IN (11) /* Int/Bulk 2048 Bulk 10 */ -#define EP11IN (12) /* Bulk 2048 Yes 11 */ -#define EP12IN (13) /* Bulk 2048 Yes 12 */ -#define EP13IN (14) /* Bulk 2048 Yes 13 */ -#define EP14IN (15) /* Bulk 2048 Yes 14 */ -#define EP15IN (16) /* Bulk 2048 Yes 15 */ - -/* Maximum Packet sizes */ -#define MAX_PACKET_SIZE_EP0 (64) /*pipe0/pipe0: control */ -#define MAX_PACKET_SIZE_EP1 (64) /*pipe6/pipe7: interrupt */ -#define MAX_PACKET_SIZE_EP2 (512) /*pipe3/pipe4: bulk */ -#define MAX_PACKET_SIZE_EP3 (512) /*pipe1/pipe2: isochronous */ -#define MAX_PACKET_SIZE_EP6 (64) /*pipe5: Note *1 */ -#define MAX_PACKET_SIZE_EP8 (64) /*pipe7: Note *1 */ -#define MAX_PACKET_SIZE_EP9 (512) /*pipe8: Note *1 */ -#define MAX_PACKET_SIZE_EP10 (512) /*pipe9: Note *1 */ -#define MAX_PACKET_SIZE_EP11 (512) /*pipe10: Note *1 */ -#define MAX_PACKET_SIZE_EP12 (512) /*pipe11: Note *1 */ -#define MAX_PACKET_SIZE_EP13 (512) /*pipe12: Note *1 */ -#define MAX_PACKET_SIZE_EP14 (512) /*pipe13: Note *1 */ -#define MAX_PACKET_SIZE_EP15 (512) /*pipe14: Note *1 */ -/* Note *1: This pipe is not configure in sample program */ - - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoints */ -#define EPBULK_OUT (EP2OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoints */ -#define EPINT_OUT (EP1OUT) -#define EPINT_IN (EP1IN) -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoints */ -#define EPISO_OUT (EP3OUT) -#define EPISO_IN (EP3IN) -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) -#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) -#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3) - -/*EOF*/
--- a/Drivers/USBDevice/USBDevice/USBEndpoints_STM32F4.h Mon Mar 18 10:21:53 2019 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* Copyright (c) 2010-2011 mbed.org, MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -* and associated documentation files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all copies or -* substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#define NUMBER_OF_LOGICAL_ENDPOINTS (4) -#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2) - -/* Define physical endpoint numbers */ - -/* Endpoint No. Type(s) MaxPacket DoubleBuffer */ -/* ---------------- ------------ ---------- --- */ -#define EP0OUT (0) /* Control 64 No */ -#define EP0IN (1) /* Control 64 No */ -#define EP1OUT (2) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP1IN (3) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP2OUT (4) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP2IN (5) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP3OUT (6) /* Int/Bulk/Iso 64/64/1023 Yes */ -#define EP3IN (7) /* Int/Bulk/Iso 64/64/1023 Yes */ - -/* Maximum Packet sizes */ - -#define MAX_PACKET_SIZE_EP0 (64) -#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */ -#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */ -#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */ - -#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */ -#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */ -#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */ - -/* Generic endpoints - intended to be portable accross devices */ -/* and be suitable for simple USB devices. */ - -/* Bulk endpoint */ -#define EPBULK_OUT (EP2OUT) -#define EPBULK_IN (EP2IN) -#define EPBULK_OUT_callback EP2_OUT_callback -#define EPBULK_IN_callback EP2_IN_callback -/* Interrupt endpoint */ -#define EPINT_OUT (EP1OUT) -#define EPINT_IN (EP1IN) -#define EPINT_OUT_callback EP1_OUT_callback -#define EPINT_IN_callback EP1_IN_callback -/* Isochronous endpoint */ -#define EPISO_OUT (EP3OUT) -#define EPISO_IN (EP3IN) -#define EPISO_OUT_callback EP3_OUT_callback -#define EPISO_IN_callback EP3_IN_callback - -#define MAX_PACKET_SIZE_EPBULK (MAX_PACKET_SIZE_EP2) -#define MAX_PACKET_SIZE_EPINT (MAX_PACKET_SIZE_EP1) -#define MAX_PACKET_SIZE_EPISO (MAX_PACKET_SIZE_EP3_ISO)
--- a/Drivers/USBDevice/USBDevice/USBHAL.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBBUSINTERFACE_H
-#define USBBUSINTERFACE_H
-
-#include "mbed.h"
-#include "USBEndpoints.h"
-#include "toolchain.h"
-
-//#ifdef __GNUC__
-//#define __packed __attribute__ ((__packed__))
-//#endif
-
-class USBHAL {
-public:
- /* Configuration */
- USBHAL();
- ~USBHAL();
- void connect(void);
- void disconnect(void);
- void configureDevice(void);
- void unconfigureDevice(void);
- void setAddress(uint8_t address);
- void remoteWakeup(void);
-
- /* Endpoint 0 */
- void EP0setup(uint8_t *buffer);
- void EP0read(void);
- void EP0readStage(void);
- uint32_t EP0getReadResult(uint8_t *buffer);
- void EP0write(uint8_t *buffer, uint32_t size);
- void EP0getWriteResult(void);
- void EP0stall(void);
-
- /* Other endpoints */
- EP_STATUS endpointRead(uint8_t endpoint, uint32_t maximumSize);
- EP_STATUS endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead);
- EP_STATUS endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size);
- EP_STATUS endpointWriteResult(uint8_t endpoint);
- void stallEndpoint(uint8_t endpoint);
- void unstallEndpoint(uint8_t endpoint);
- bool realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options);
- bool getEndpointStallState(unsigned char endpoint);
- uint32_t endpointReadcore(uint8_t endpoint, uint8_t *buffer);
-
-protected:
- virtual void busReset(void){};
- virtual void EP0setupCallback(void){};
- virtual void EP0out(void){};
- virtual void EP0in(void){};
- virtual void connectStateChanged(unsigned int connected){};
- virtual void suspendStateChanged(unsigned int suspended){};
- virtual void SOF(int frameNumber){};
-
- virtual bool EP1_OUT_callback(){return false;};
- virtual bool EP1_IN_callback(){return false;};
- virtual bool EP2_OUT_callback(){return false;};
- virtual bool EP2_IN_callback(){return false;};
- virtual bool EP3_OUT_callback(){return false;};
- virtual bool EP3_IN_callback(){return false;};
-#if !defined(TARGET_STM32F4)
- virtual bool EP4_OUT_callback(){return false;};
- virtual bool EP4_IN_callback(){return false;};
-#if !(defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549))
- virtual bool EP5_OUT_callback(){return false;};
- virtual bool EP5_IN_callback(){return false;};
- virtual bool EP6_OUT_callback(){return false;};
- virtual bool EP6_IN_callback(){return false;};
- virtual bool EP7_OUT_callback(){return false;};
- virtual bool EP7_IN_callback(){return false;};
- virtual bool EP8_OUT_callback(){return false;};
- virtual bool EP8_IN_callback(){return false;};
- virtual bool EP9_OUT_callback(){return false;};
- virtual bool EP9_IN_callback(){return false;};
- virtual bool EP10_OUT_callback(){return false;};
- virtual bool EP10_IN_callback(){return false;};
- virtual bool EP11_OUT_callback(){return false;};
- virtual bool EP11_IN_callback(){return false;};
- virtual bool EP12_OUT_callback(){return false;};
- virtual bool EP12_IN_callback(){return false;};
- virtual bool EP13_OUT_callback(){return false;};
- virtual bool EP13_IN_callback(){return false;};
- virtual bool EP14_OUT_callback(){return false;};
- virtual bool EP14_IN_callback(){return false;};
- virtual bool EP15_OUT_callback(){return false;};
- virtual bool EP15_IN_callback(){return false;};
-#endif
-#endif
-
-private:
- void usbisr(void);
- static void _usbisr(void);
- static USBHAL * instance;
-
-#if defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549)
- bool (USBHAL::*epCallback[10 - 2])(void);
-#elif defined(TARGET_STM32F4)
- bool (USBHAL::*epCallback[8 - 2])(void);
-#else
- bool (USBHAL::*epCallback[32 - 2])(void);
-#endif
-
-
-};
-#endif
--- a/Drivers/USBDevice/USBDevice/USBHAL_EFM32.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,775 +0,0 @@
-/* Copyright 2015 Silicon Labs, http://www.silabs.com
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if defined TARGET_EFM32GG_STK3700 || \
- defined TARGET_EFM32LG_STK3600 || \
- defined TARGET_EFM32WG_STK3800 || \
- defined TARGET_EFM32HG_STK3400
-
-#include "USBHAL.h"
-#include "em_usb.h"
-#include "em_usbtypes.h"
-#include "em_usbhal.h"
-#include "em_usbd.h"
-
-#include "sleepmodes.h"
-
-enum USBISRCommand {
- CMD_HANDLED = 0,
- CMD_EP0SETUP,
- CMD_EP0IN,
- CMD_EP0OUT,
- CMD_EP_XFER_COMPLETED,
- CMD_SOF,
- CMD_BUSRESET,
- CMD_SUSPEND_STATE_CHANGED,
- CMD_ENUM_END_MARKER
-};
-
-enum IEPStatus {
- NOT_CONFIGURED = 0,
- IDLE = 1,
- READ_PENDING = 2,
- WRITE_PENDING = 3,
- READ_COMPLETE = 4,
- WRITE_COMPLETE = 5,
- FAILED_INVALID = 6,
- FAILED_STALLED = 7
-};
-
-typedef struct {
- IEPStatus status;
- uint32_t byte_count;
- uint32_t max_packet;
- USB_XferCompleteCb_TypeDef intern_cb;
- uint8_t *data_buf;
-} ep_state_t;
-
-USBHAL * USBHAL::instance;
-static uint8_t ep0setupdata[8];
-static ep_state_t ep_state[NUMBER_OF_ENDPOINTS];
-#ifdef USB_USE_DYNAMIC_MEMORY
-static uint8_t ep0in_data_buf[MAX_PACKET_SIZE_EP0] __attribute__ ((aligned (4)));
-static uint8_t ep0out_data_buf[MAX_PACKET_SIZE_EP0]; // FIXME: does this need to be this big?
-#else
-static uint8_t ep_data_buf[NUMBER_OF_ENDPOINTS][64] __attribute__ ((aligned (4)));
-#endif
-
-static void run_cmd(USBISRCommand cmd, uint32_t param);
-static void (*isrptr)() = NULL;
-static USBISRCommand usb_isrcmd = CMD_HANDLED;
-static uint32_t usb_isrcmd_param = 0;
-
-extern "C" void usbhal_allow_em2(bool allow_em2);
-
-#ifdef DEBUG_USB_API
-#define TRACE(fmt,...) printf("USB: %s: " fmt "\n", __func__, __VA_ARGS__);
-#define TRACE_FUNC_IN printf("USB: > %s\n",__func__);
-#define TRACE_FUNC_IN_P(fmt, ...) printf("USB: > %s: " fmt "\n", __func__, __VA_ARGS__);
-#else
-#define TRACE(fmt,...)
-#define TRACE_FUNC_IN
-#define TRACE_FUNC_IN_P(fmt, ...)
-#endif
-
-static EP_STATUS internEndpointRead(uint8_t ep, uint32_t maxSize);
-
-static int usbhal_xfer_complete_cb(uint8_t epaddr, USB_Status_TypeDef status,
- uint32_t xferred, uint32_t remaining);
-static void usbhal_free_buffers(void);
-
-/* Internal EP transfer complete callbacks */
-#define EPCB(n) static int usbhal_xfer_complete_cb_##n(USB_Status_TypeDef status, \
- uint32_t xferred, uint32_t remaining) { \
- return usbhal_xfer_complete_cb(n, status, xferred, remaining); \
-}
-/* ------^ */
-EPCB(EP0OUT)
-EPCB(EP0IN)
-EPCB(EP1OUT)
-EPCB(EP1IN)
-EPCB(EP2OUT)
-EPCB(EP2IN)
-EPCB(EP3OUT)
-EPCB(EP3IN)
-#ifndef TARGET_EFM32HG_STK3400
-EPCB(EP4OUT)
-EPCB(EP4IN)
-EPCB(EP5OUT)
-EPCB(EP5IN)
-EPCB(EP6OUT)
-EPCB(EP6IN)
-#endif
-
-static inline bool is_aligned(const void *pointer, size_t byte_count)
-{
- return ((uintptr_t)pointer % byte_count == 0);
-}
-
-USBHAL::USBHAL(void)
-{
- TRACE_FUNC_IN;
-
- isrptr = &USBHAL::_usbisr;
-
- if (instance) {
- TRACE("Assert self failed! instance=%p", instance);
- abort();
- }
- instance = this;
-
- // When USB is active, we can't go below EM1. This block may
- // be dynamically removed/reinstated to allow deeper sleep.
- usbhal_allow_em2(false);
-
- // When in suspend / Vbus off we can go to EM2, but never below
- // that as long as USB is being used. Despite the name the call here
- // blocks entering modes _below_ EM2, but allows EM2.
- blockSleepMode(EM2);
-
- epCallback[EP0OUT] = NULL;
- epCallback[EP0IN ] = NULL;
- epCallback[EP1OUT] = &USBHAL::EP1_OUT_callback;
- epCallback[EP1IN ] = &USBHAL::EP1_IN_callback;
- epCallback[EP2OUT] = &USBHAL::EP2_OUT_callback;
- epCallback[EP2IN ] = &USBHAL::EP2_IN_callback;
- epCallback[EP3OUT] = &USBHAL::EP3_OUT_callback;
- epCallback[EP3IN ] = &USBHAL::EP3_IN_callback;
-#ifndef TARGET_EFM32HG_STK3400
- epCallback[EP4OUT] = &USBHAL::EP4_OUT_callback;
- epCallback[EP4IN ] = &USBHAL::EP4_IN_callback;
- epCallback[EP5OUT] = &USBHAL::EP5_OUT_callback;
- epCallback[EP5IN ] = &USBHAL::EP5_IN_callback;
- epCallback[EP6OUT] = &USBHAL::EP6_OUT_callback;
- epCallback[EP6IN ] = &USBHAL::EP6_IN_callback;
-#endif
-
- memset(ep_state, 0, sizeof(ep_state));
-
- ep_state[EP0OUT].intern_cb = usbhal_xfer_complete_cb_EP0OUT;
- ep_state[EP0IN ].intern_cb = usbhal_xfer_complete_cb_EP0IN;
- ep_state[EP1OUT].intern_cb = usbhal_xfer_complete_cb_EP1OUT;
- ep_state[EP1IN ].intern_cb = usbhal_xfer_complete_cb_EP1IN;
- ep_state[EP2OUT].intern_cb = usbhal_xfer_complete_cb_EP2OUT;
- ep_state[EP2IN ].intern_cb = usbhal_xfer_complete_cb_EP2IN;
- ep_state[EP3OUT].intern_cb = usbhal_xfer_complete_cb_EP3OUT;
- ep_state[EP3IN ].intern_cb = usbhal_xfer_complete_cb_EP3IN;
-#ifndef TARGET_EFM32HG_STK3400
- ep_state[EP4OUT].intern_cb = usbhal_xfer_complete_cb_EP4OUT;
- ep_state[EP4IN ].intern_cb = usbhal_xfer_complete_cb_EP4IN;
- ep_state[EP5OUT].intern_cb = usbhal_xfer_complete_cb_EP5OUT;
- ep_state[EP5IN ].intern_cb = usbhal_xfer_complete_cb_EP5IN;
- ep_state[EP6OUT].intern_cb = usbhal_xfer_complete_cb_EP6OUT;
- ep_state[EP6IN ].intern_cb = usbhal_xfer_complete_cb_EP6IN;
-#endif
-
-#ifdef USB_USE_DYNAMIC_MEMORY
- ep_state[EP0OUT].data_buf = ep0out_data_buf;
- ep_state[EP0IN].data_buf = ep0in_data_buf;
-#else
- for (int i=0 ; i<NUMBER_OF_ENDPOINTS ; i++) {
- ep_state[i].data_buf = ep_data_buf[i];
- }
-#endif
-}
-
-USBHAL::~USBHAL(void)
-{
- TRACE_FUNC_IN;
- USBD_AbortAllTransfers();
- USBD_Disconnect();
- usbhal_free_buffers();
-
- usbhal_allow_em2(true);
- unblockSleepMode(EM2);
-}
-
-extern "C" void usbhal_allow_em2(bool allow_em2)
-{
- if (allow_em2) {
- // unblockSleepMode is safe to call even if we would unblock
- // an already unblocked mode, so no checks here.
- unblockSleepMode(EM1);
- } else {
- blockSleepMode(EM1);
- }
-}
-
-static void usbhal_reset_cb(void)
-{
- TRACE_FUNC_IN;
- run_cmd(CMD_BUSRESET, 0);
-}
-
-#ifdef DEBUG_USB_API
-static const char *usbstate[] = { "NONE", "ATTACHED", "POWERED", "DEFAULT",
- "ADDRESSED", "CONFIGURED", "SUSPENDED", "???" };
-#endif
-
-static void usbhal_state_change_cb(USBD_State_TypeDef oldState,
- USBD_State_TypeDef newState)
-{
- TRACE("state changed %s -> %s", usbstate[oldState], usbstate[newState]);
-
- if (oldState == USBD_STATE_SUSPENDED) {
- run_cmd(CMD_SUSPEND_STATE_CHANGED, 0);
- }
-
- if (newState == USBD_STATE_SUSPENDED) {
- run_cmd(CMD_SUSPEND_STATE_CHANGED, 1);
- }
-
- // Should call connectStateChanged from here as well but there is
- // no documentation on when to actually do so. (And the implementation
- // in USBDevice.cpp is a stub)
-
- // HACK! Since connectStateChanged is not used, indicate the loss
- // off connection by reporting a bus reset. This causes USBDevice
- // to realise that at least it's not in CONFIGURED anymore, and
- // stop trying to read/write in a busyloop.
- if (newState == USBD_STATE_NONE) {
- run_cmd(CMD_BUSRESET, 0);
- }
-}
-
-static int usbhal_setupcmd_cb(const USB_Setup_TypeDef *setup)
-{
- TRACE_FUNC_IN;
- if (!setup) {
- EFM_ASSERT(false);
- return USB_STATUS_REQ_ERR;
- }
-
- memcpy(ep0setupdata, setup, 8);
- run_cmd(CMD_EP0SETUP, 0);
-
- return USB_STATUS_OK;
-}
-
-static void usbhal_sof_cb(uint16_t frameNum)
-{
- run_cmd(CMD_SOF, frameNum);
-}
-
-static void usbhal_free_buffers(void)
-{
-#ifdef USB_USE_DYNAMIC_MEMORY
- TRACE_FUNC_IN;
-
- for (int i=EP1OUT ; i<NUMBER_OF_ENDPOINTS ; i++ ) {
- if (ep_state[i].data_buf) {
- free(ep_state[i].data_buf);
- ep_state[i].data_buf = NULL;
- }
- }
-#endif
-}
-
-void USBHAL::connect(void)
-{
- TRACE_FUNC_IN;
-
- // Init datastructures must be static - driver will use these even after the init function exits!
-
- static const uint8_t buffer_multiplier[] = { 1 }; // Mult 1 for control EP
- static const USBD_Callbacks_TypeDef usbd_callbacks = {
- .usbReset = usbhal_reset_cb,
- .usbStateChange = usbhal_state_change_cb,
- .setupCmd = usbhal_setupcmd_cb,
- .isSelfPowered = NULL,
- .sofInt = usbhal_sof_cb
- };
-
- USBD_Init_TypeDef initdata = {
- .deviceDescriptor = NULL,
- .configDescriptor = NULL,
- .stringDescriptors = NULL,
- .numberOfStrings = 0,
- .bufferingMultiplier = buffer_multiplier,
- .callbacks = &usbd_callbacks,
- .reserved = 0
- };
-
- int ret = USBD_Init(&initdata);
-
- TRACE("init = %d, devicedesc = %lx, configdesc = %lx", ret,
- (uint32_t) initdata.deviceDescriptor,
- (uint32_t) initdata.configDescriptor);
-
- EFM_ASSERT(ret == USB_STATUS_OK);
-}
-
-void USBHAL::disconnect(void)
-{
- TRACE_FUNC_IN;
- USBD_Disconnect();
-}
-
-void USBHAL::configureDevice(void)
-{
- TRACE_FUNC_IN;
- USBD_SetUsbState(USBD_STATE_CONFIGURED);
-}
-
-void USBHAL::unconfigureDevice(void)
-{
- TRACE_FUNC_IN;
- USBD_SetUsbState(USBD_STATE_DEFAULT);
- usbhal_free_buffers();
-}
-
-void USBHAL::setAddress(uint8_t address)
-{
- TRACE_FUNC_IN_P("addr 0x%x", (unsigned)address);
- USBD_SetAddress(address);
-}
-
-void USBHAL::remoteWakeup(void)
-{
- TRACE_FUNC_IN;
- USBD_RemoteWakeup();
-}
-
-void USBHAL::EP0setup(uint8_t *buffer)
-{
- TRACE_FUNC_IN;
- EFM_ASSERT(buffer);
- if (buffer) {
- memcpy(buffer, ep0setupdata, 8);
- }
-}
-
-void USBHAL::EP0read(void)
-{
- TRACE_FUNC_IN;
- (void)internEndpointRead(0, MAX_PACKET_SIZE_EP0);
-}
-
-void USBHAL::EP0readStage(void)
-{
- TRACE_FUNC_IN;
- // Not needed
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
-{
- TRACE_FUNC_IN;
- EFM_ASSERT(buffer);
-
- uint32_t read = 0;
- endpointReadResult(0, buffer, &read);
- return read;
-}
-
-static int usbhal_xfer_complete_cb(uint8_t ep, USB_Status_TypeDef status,
- uint32_t xferred, uint32_t remaining)
-{
- TRACE_FUNC_IN_P("ep 0x%x, status %u, xferred %lu, rem %lu",
- ep, status, xferred, remaining);
-
- if (ep >= NUMBER_OF_ENDPOINTS) {
- EFM_ASSERT(false);
- return USB_STATUS_REQ_ERR;
- }
-
- switch (ep) {
- case EP0OUT:
- if (ep_state[EP0OUT].status == READ_PENDING) {
- ep_state[EP0OUT].status = READ_COMPLETE;
- ep_state[EP0OUT].byte_count = xferred;
- // drop zlp
- if (xferred == 0) {
- break;
- }
- }
- run_cmd(CMD_EP0OUT, 0);
- break;
-
- case EP0IN:
- run_cmd(CMD_EP0IN, 0);
- break;
-
- default:
- bool write = ep & 1;
-
- if (status == USB_STATUS_OK) {
- if (!write && ep_state[ep].status == READ_PENDING) {
- ep_state[ep].status = READ_COMPLETE;
- ep_state[ep].byte_count = xferred;
- } else if (write && ep_state[ep].status == WRITE_PENDING) {
- ep_state[ep].status = WRITE_COMPLETE;
- } else {
- ep_state[ep].status = FAILED_INVALID;
- }
- } else {
- ep_state[ep].status = FAILED_INVALID;
- }
-
- if (ep_state[ep].status != FAILED_INVALID) {
- run_cmd(CMD_EP_XFER_COMPLETED, ep);
- }
- break;
- }
-
- return USB_STATUS_OK;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
-{
- //TRACE_FUNC_IN_P("buffer %lx, size %lu", (uint32_t) buffer, size);
-
- int ret;
- USB_XferCompleteCb_TypeDef cb = ep_state[EP0IN].intern_cb;
-
- EFM_ASSERT((buffer != NULL) || (size == 0));
- EFM_ASSERT(size <= MAX_PACKET_SIZE_EP0);
-
- if (!buffer || size == 0) {
- // No callback after writing EP0 ZLP
- cb = NULL;
- }
-
- if (buffer && !is_aligned(buffer,4)) {
- // Copy unaligned data to write-buffer before USBD_Write
- memcpy(ep_state[EP0IN].data_buf, buffer, size);
- ret = USBD_Write(0, ep_state[EP0IN].data_buf, size, cb);
- } else {
- ret = USBD_Write(0, buffer, size, cb);
- }
-
- if (ret != USB_STATUS_OK) {
- TRACE("FAILED - ret %d", ret);
- }
-}
-
-void USBHAL::EP0stall(void)
-{
- TRACE_FUNC_IN;
- USBD_StallEp0();
-}
-
-static EP_STATUS internEndpointRead(uint8_t ep, uint32_t maxSize)
-{
- //TRACE_FUNC_IN_P("endpoint 0x%x, size %ld, cb %d", (unsigned)ep, maxSize, useCallback);
-
- if (ep >= NUMBER_OF_ENDPOINTS) {
- EFM_ASSERT(false);
- return EP_INVALID;
- }
-
- ep_state[ep].status = READ_PENDING;
-
- int ret = USBD_Read(USB_EP_TO_ADDR(ep), ep_state[ep].data_buf, maxSize,
- ep_state[ep].intern_cb);
-
- if (ret == USB_STATUS_OK) {
- return EP_PENDING;
- } else {
- TRACE("FAILED - ret %d", ret);
-
- if (ret == USB_STATUS_EP_STALLED) {
- return EP_STALLED;
- } else {
- return EP_INVALID;
- }
- }
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize)
-{
- return internEndpointRead(endpoint, maximumSize);
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead)
-{
- TRACE_FUNC_IN;
-
- if (endpoint >= NUMBER_OF_ENDPOINTS) {
- EFM_ASSERT(false);
- return EP_INVALID;
- }
-
- EFM_ASSERT(data);
- EFM_ASSERT(bytesRead);
- if (!data || !bytesRead) {
- return EP_INVALID;
- }
-
- switch (ep_state[endpoint].status) {
- case READ_PENDING:
- return EP_PENDING;
-
- case READ_COMPLETE:
- memcpy(data, ep_state[endpoint].data_buf, ep_state[endpoint].byte_count);
- *bytesRead = ep_state[endpoint].byte_count;
- ep_state[endpoint].status = IDLE;
- return EP_COMPLETED;
-
- case FAILED_STALLED:
- ep_state[endpoint].status = IDLE;
- return EP_STALLED;
-
- default:
- ep_state[endpoint].status = IDLE;
- return EP_INVALID;
- }
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
-{
- TRACE_FUNC_IN_P("endpoint 0x%x, data 0x%lx, size %lu", (unsigned )endpoint, (uint32_t)data, size);
-
- EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS);
- EFM_ASSERT(endpoint > EP0IN);
- EFM_ASSERT(size <= ep_state[endpoint].max_packet);
- EFM_ASSERT(data);
-
- uint8_t ep = USB_EP_TO_INDEX(endpoint);
-
- if (endpoint >= NUMBER_OF_ENDPOINTS || endpoint <= EP0IN) {
- return EP_INVALID;
- }
-
- if (size > ep_state[endpoint].max_packet) {
- return EP_INVALID;
- }
-
- if (!data) {
- return EP_INVALID;
- }
-
- memcpy(ep_state[ep].data_buf, data, size);
-
- ep_state[ep].status = WRITE_PENDING;
- int ret = USBD_Write(USB_EP_TO_ADDR(endpoint), ep_state[ep].data_buf, size, ep_state[ep].intern_cb);
-
- if (ret == USB_STATUS_EP_STALLED) {
- ep_state[ep].status = IDLE;
- return EP_STALLED;
- } else if (ret != USB_STATUS_OK) {
- ep_state[ep].status = IDLE;
- return EP_INVALID;
- }
-
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
-{
- if (endpoint >= NUMBER_OF_ENDPOINTS) {
- EFM_ASSERT(false);
- return EP_INVALID;
- }
-
- switch (ep_state[endpoint].status) {
- case WRITE_PENDING:
- return EP_PENDING;
-
- case WRITE_COMPLETE:
- ep_state[endpoint].status = IDLE;
- return EP_COMPLETED;
-
- case FAILED_STALLED:
- ep_state[endpoint].status = IDLE;
- return EP_STALLED;
-
- default:
- ep_state[endpoint].status = IDLE;
- return EP_INVALID;
- }
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint)
-{
- TRACE_FUNC_IN;
-
- EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS);
- EFM_ASSERT((endpoint != EP0OUT) && (endpoint != EP0IN));
-
- USBD_StallEp(USB_EP_TO_ADDR(endpoint));
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint)
-{
- TRACE_FUNC_IN;
-
- EFM_ASSERT(endpoint < NUMBER_OF_ENDPOINTS);
- EFM_ASSERT((endpoint != EP0OUT) && (endpoint != EP0IN));
-
- USBD_UnStallEp(USB_EP_TO_ADDR(endpoint));
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
-{
- TRACE_FUNC_IN_P("endpoint %d, packetsize %ld, options 0x%lx", endpoint,
- maxPacket, options);
-
- int mult = 1; // RX/TX buffer size multiplier
- int type = USB_EPTYPE_INTR;
-
- if (endpoint >= NUMBER_OF_ENDPOINTS) {
- EFM_ASSERT(false);
- return false;
- }
-
- if (endpoint == EP0IN || endpoint == EP0OUT) {
- EFM_ASSERT(false);
- return false;
- }
-
- ep_state[endpoint].max_packet = 0;
-
- if (endpoint == EPISO_OUT || endpoint == EPISO_IN) {
- if (maxPacket > MAX_PACKET_SIZE_EPISO) {
- EFM_ASSERT(false);
- return false;
- }
- } else if ((maxPacket > MAX_PACKET_SIZE_EPBULK) || (maxPacket > MAX_PACKET_SIZE_EPINT)) {
- EFM_ASSERT(false);
- return false;
- }
-
- // USBDevice performs a read right after creating the endpoints,
- // before calling configureDevice. The read will fail since
- // at that point the device state is still ADDRESSED. Workaround
- // is to force configured state here.
- //
- // This relies on USBDevice to not call realiseEndpoint unless
- // it is transitioning to the CONFIGURED state.
- USBD_SetUsbState(USBD_STATE_CONFIGURED);
-
- // Why doesn't this function have a type param? This is silly...
- switch (endpoint) {
- case EPBULK_OUT:
- case EPBULK_IN:
- type = USB_EPTYPE_BULK;
- mult = 2;
- break;
- case EPINT_OUT:
- case EPINT_IN:
- type = USB_EPTYPE_INTR;
- mult = 1;
- break;
- case EPISO_OUT:
- case EPISO_IN:
- type = USB_EPTYPE_ISOC;
- mult = 2; // ?
- break;
- }
-
- // Some options force the endpoint to a specific type
- if( options & ISOCHRONOUS ) {
- type = USB_EPTYPE_ISOC;
- mult = 2; // ?
- } else if ( options & RATE_FEEDBACK_MODE ) {
- // No support for whatever rate feedback is, but for interrupt only
- type = USB_EPTYPE_INTR;
- mult = 1;
- }
-
-#ifdef USB_USE_DYNAMIC_MEMORY
- if (ep_state[endpoint].data_buf) {
- free(ep_state[endpoint].data_buf);
- }
-
- ep_state[endpoint].data_buf = (uint8_t *)malloc(maxPacket);
-
- if (!ep_state[endpoint].data_buf) {
- EFM_ASSERT(false);
- return false;
- }
-#endif
-
- int ret = USBD_AddEndpoint(USB_EP_TO_ADDR(endpoint), type, maxPacket, mult);
-
- if (ret == USB_STATUS_OK) {
- ep_state[endpoint].status = IDLE;
- ep_state[endpoint].max_packet = maxPacket;
- return true;
- } else {
- return false;
- }
-}
-
-bool USBHAL::getEndpointStallState(unsigned char endpoint)
-{
- TRACE_FUNC_IN;
- if (endpoint >= NUMBER_OF_ENDPOINTS) {
- EFM_ASSERT(false);
- return false;
- }
- return USBD_EpIsStalled(USB_EP_TO_ADDR(endpoint));
-}
-
-static void run_cmd(USBISRCommand cmd, uint32_t param)
-{
- if (usb_isrcmd != CMD_HANDLED || cmd >= CMD_ENUM_END_MARKER) {
- EFM_ASSERT(false);
- abort();
- }
-
- usb_isrcmd = cmd;
- usb_isrcmd_param = param;
- isrptr();
-}
-
-void USBHAL::_usbisr(void)
-{
- EFM_ASSERT(instance);
- instance->usbisr();
-}
-
-void USBHAL::usbisr(void)
-{
- //TRACE_FUNC_IN;
-
- // This "ISR" is used just to route callbacks from SiL USB driver
- // callback context (which can not call protected/private USBHAL
- // methods), to the actual USBHAL.
-
- EFM_ASSERT(usb_isrcmd != CMD_HANDLED);
- switch (usb_isrcmd) {
- case CMD_EP0SETUP:
- this->EP0setupCallback();
- break;
- case CMD_EP0IN:
- this->EP0in();
- break;
- case CMD_EP0OUT:
- this->EP0out();
- break;
- case CMD_BUSRESET:
- this->busReset();
- break;
- case CMD_EP_XFER_COMPLETED:
- if (epCallback[usb_isrcmd_param] && instance) {
- (instance->*(epCallback[usb_isrcmd_param]))();
- }
- break;
- case CMD_SOF:
- this->SOF(usb_isrcmd_param);
- break;
- case CMD_SUSPEND_STATE_CHANGED:
- this->suspendStateChanged(usb_isrcmd_param);
- break;
- default:
- EFM_ASSERT(false);
- break;
- }
- usb_isrcmd = CMD_HANDLED;
-}
-#endif
-
-// End of file
--- a/Drivers/USBDevice/USBDevice/USBHAL_KL25Z.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,552 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#if defined(TARGET_KL25Z) | defined(TARGET_KL43Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D50M) | defined(TARGET_K64F) | defined(TARGET_K22F) | defined(TARGET_TEENSY3_1)
-
-#include "USBHAL.h"
-
-USBHAL * USBHAL::instance;
-
-static volatile int epComplete = 0;
-
-// Convert physical endpoint number to register bit
-#define EP(endpoint) (1<<(endpoint))
-
-// Convert physical to logical
-#define PHY_TO_LOG(endpoint) ((endpoint)>>1)
-
-// Get endpoint direction
-#define IN_EP(endpoint) ((endpoint) & 1U ? true : false)
-#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true)
-
-#define BD_OWN_MASK (1<<7)
-#define BD_DATA01_MASK (1<<6)
-#define BD_KEEP_MASK (1<<5)
-#define BD_NINC_MASK (1<<4)
-#define BD_DTS_MASK (1<<3)
-#define BD_STALL_MASK (1<<2)
-
-#define TX 1
-#define RX 0
-#define ODD 0
-#define EVEN 1
-// this macro waits a physical endpoint number
-#define EP_BDT_IDX(ep, dir, odd) (((ep * 4) + (2 * dir) + (1 * odd)))
-
-#define SETUP_TOKEN 0x0D
-#define IN_TOKEN 0x09
-#define OUT_TOKEN 0x01
-#define TOK_PID(idx) ((bdt[idx].info >> 2) & 0x0F)
-
-// for each endpt: 8 bytes
-typedef struct BDT {
- uint8_t info; // BD[0:7]
- uint8_t dummy; // RSVD: BD[8:15]
- uint16_t byte_count; // BD[16:32]
- uint32_t address; // Addr
-} BDT;
-
-
-// there are:
-// * 16 bidirectionnal endpt -> 32 physical endpt
-// * as there are ODD and EVEN buffer -> 32*2 bdt
-__attribute__((__aligned__(512))) BDT bdt[NUMBER_OF_PHYSICAL_ENDPOINTS * 2];
-uint8_t * endpoint_buffer[(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2];
-uint8_t * endpoint_buffer_iso[2*2];
-
-static uint8_t set_addr = 0;
-static uint8_t addr = 0;
-
-static uint32_t Data1 = 0x55555555;
-
-static uint32_t frameNumber() {
- return((USB0->FRMNUML | (USB0->FRMNUMH << 8)) & 0x07FF);
-}
-
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
- return 0;
-}
-
-USBHAL::USBHAL(void) {
- // Disable IRQ
- NVIC_DisableIRQ(USB0_IRQn);
-
-#if defined(TARGET_K64F)
- MPU->CESR=0;
-#endif
- // fill in callback array
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP1_IN_callback;
- epCallback[2] = &USBHAL::EP2_OUT_callback;
- epCallback[3] = &USBHAL::EP2_IN_callback;
- epCallback[4] = &USBHAL::EP3_OUT_callback;
- epCallback[5] = &USBHAL::EP3_IN_callback;
- epCallback[6] = &USBHAL::EP4_OUT_callback;
- epCallback[7] = &USBHAL::EP4_IN_callback;
- epCallback[8] = &USBHAL::EP5_OUT_callback;
- epCallback[9] = &USBHAL::EP5_IN_callback;
- epCallback[10] = &USBHAL::EP6_OUT_callback;
- epCallback[11] = &USBHAL::EP6_IN_callback;
- epCallback[12] = &USBHAL::EP7_OUT_callback;
- epCallback[13] = &USBHAL::EP7_IN_callback;
- epCallback[14] = &USBHAL::EP8_OUT_callback;
- epCallback[15] = &USBHAL::EP8_IN_callback;
- epCallback[16] = &USBHAL::EP9_OUT_callback;
- epCallback[17] = &USBHAL::EP9_IN_callback;
- epCallback[18] = &USBHAL::EP10_OUT_callback;
- epCallback[19] = &USBHAL::EP10_IN_callback;
- epCallback[20] = &USBHAL::EP11_OUT_callback;
- epCallback[21] = &USBHAL::EP11_IN_callback;
- epCallback[22] = &USBHAL::EP12_OUT_callback;
- epCallback[23] = &USBHAL::EP12_IN_callback;
- epCallback[24] = &USBHAL::EP13_OUT_callback;
- epCallback[25] = &USBHAL::EP13_IN_callback;
- epCallback[26] = &USBHAL::EP14_OUT_callback;
- epCallback[27] = &USBHAL::EP14_IN_callback;
- epCallback[28] = &USBHAL::EP15_OUT_callback;
- epCallback[29] = &USBHAL::EP15_IN_callback;
-
-#if defined(TARGET_KL43Z)
- // enable USBFS clock
- SIM->SCGC4 |= SIM_SCGC4_USBFS_MASK;
-
- // enable the IRC48M clock
- USB0->CLK_RECOVER_IRC_EN |= USB_CLK_RECOVER_IRC_EN_IRC_EN_MASK;
-
- // enable the USB clock recovery tuning
- USB0->CLK_RECOVER_CTRL |= USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_MASK;
-
- // choose usb src clock
- SIM->SOPT2 |= SIM_SOPT2_USBSRC_MASK;
-#else
- // choose usb src as PLL
- SIM->SOPT2 &= ~SIM_SOPT2_PLLFLLSEL_MASK;
- SIM->SOPT2 |= (SIM_SOPT2_USBSRC_MASK | (1 << SIM_SOPT2_PLLFLLSEL_SHIFT));
-
- // enable OTG clock
- SIM->SCGC4 |= SIM_SCGC4_USBOTG_MASK;
-#endif
-
- // Attach IRQ
- instance = this;
- NVIC_SetVector(USB0_IRQn, (uint32_t)&_usbisr);
- NVIC_EnableIRQ(USB0_IRQn);
-
- // USB Module Configuration
- // Reset USB Module
- USB0->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;
- while(USB0->USBTRC0 & USB_USBTRC0_USBRESET_MASK);
-
- // Set BDT Base Register
- USB0->BDTPAGE1 = (uint8_t)((uint32_t)bdt>>8);
- USB0->BDTPAGE2 = (uint8_t)((uint32_t)bdt>>16);
- USB0->BDTPAGE3 = (uint8_t)((uint32_t)bdt>>24);
-
- // Clear interrupt flag
- USB0->ISTAT = 0xff;
-
- // USB Interrupt Enablers
- USB0->INTEN |= USB_INTEN_TOKDNEEN_MASK |
- USB_INTEN_SOFTOKEN_MASK |
- USB_INTEN_ERROREN_MASK |
- USB_INTEN_USBRSTEN_MASK;
-
- // Disable weak pull downs
- USB0->USBCTRL &= ~(USB_USBCTRL_PDE_MASK | USB_USBCTRL_SUSP_MASK);
-
- USB0->USBTRC0 |= 0x40;
-}
-
-USBHAL::~USBHAL(void) { }
-
-void USBHAL::connect(void) {
- // enable USB
- USB0->CTL |= USB_CTL_USBENSOFEN_MASK;
- // Pull up enable
- USB0->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;
-}
-
-void USBHAL::disconnect(void) {
- // disable USB
- USB0->CTL &= ~USB_CTL_USBENSOFEN_MASK;
- // Pull up disable
- USB0->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;
-
- //Free buffers if required:
- for (int i = 0; i<(NUMBER_OF_PHYSICAL_ENDPOINTS - 2) * 2; i++) {
- free(endpoint_buffer[i]);
- endpoint_buffer[i] = NULL;
- }
- free(endpoint_buffer_iso[2]);
- endpoint_buffer_iso[2] = NULL;
- free(endpoint_buffer_iso[0]);
- endpoint_buffer_iso[0] = NULL;
-}
-
-void USBHAL::configureDevice(void) {
- // not needed
-}
-
-void USBHAL::unconfigureDevice(void) {
- // not needed
-}
-
-void USBHAL::setAddress(uint8_t address) {
- // we don't set the address now otherwise the usb controller does not ack
- // we set a flag instead
- // see usbisr when an IN token is received
- set_addr = 1;
- addr = address;
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
- uint32_t handshake_flag = 0;
- uint8_t * buf;
-
- if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) {
- return false;
- }
-
- uint32_t log_endpoint = PHY_TO_LOG(endpoint);
-
- if ((flags & ISOCHRONOUS) == 0) {
- handshake_flag = USB_ENDPT_EPHSHK_MASK;
- if (IN_EP(endpoint)) {
- if (endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] == NULL)
- endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)] = (uint8_t *) malloc (64);
- buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, TX, ODD)][0];
- } else {
- if (endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] == NULL)
- endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)] = (uint8_t *) malloc (64);
- buf = &endpoint_buffer[EP_BDT_IDX(log_endpoint, RX, ODD)][0];
- }
- } else {
- if (IN_EP(endpoint)) {
- if (endpoint_buffer_iso[2] == NULL)
- endpoint_buffer_iso[2] = (uint8_t *) malloc (1023);
- buf = &endpoint_buffer_iso[2][0];
- } else {
- if (endpoint_buffer_iso[0] == NULL)
- endpoint_buffer_iso[0] = (uint8_t *) malloc (1023);
- buf = &endpoint_buffer_iso[0][0];
- }
- }
-
- // IN endpt -> device to host (TX)
- if (IN_EP(endpoint)) {
- USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag | // ep handshaking (not if iso endpoint)
- USB_ENDPT_EPTXEN_MASK; // en TX (IN) tran
- bdt[EP_BDT_IDX(log_endpoint, TX, ODD )].address = (uint32_t) buf;
- bdt[EP_BDT_IDX(log_endpoint, TX, EVEN)].address = 0;
- }
- // OUT endpt -> host to device (RX)
- else {
- USB0->ENDPOINT[log_endpoint].ENDPT |= handshake_flag | // ep handshaking (not if iso endpoint)
- USB_ENDPT_EPRXEN_MASK; // en RX (OUT) tran.
- bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].byte_count = maxPacket;
- bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].address = (uint32_t) buf;
- bdt[EP_BDT_IDX(log_endpoint, RX, ODD )].info = BD_OWN_MASK | BD_DTS_MASK;
- bdt[EP_BDT_IDX(log_endpoint, RX, EVEN)].info = 0;
- }
-
- Data1 |= (1 << endpoint);
-
- return true;
-}
-
-// read setup packet
-void USBHAL::EP0setup(uint8_t *buffer) {
- uint32_t sz;
- endpointReadResult(EP0OUT, buffer, &sz);
-}
-
-void USBHAL::EP0readStage(void) {
- Data1 &= ~1UL; // set DATA0
- bdt[0].info = (BD_DTS_MASK | BD_OWN_MASK);
-}
-
-void USBHAL::EP0read(void) {
- uint32_t idx = EP_BDT_IDX(PHY_TO_LOG(EP0OUT), RX, 0);
- bdt[idx].byte_count = MAX_PACKET_SIZE_EP0;
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
- uint32_t sz;
- endpointReadResult(EP0OUT, buffer, &sz);
- return sz;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
- endpointWrite(EP0IN, buffer, size);
-}
-
-void USBHAL::EP0getWriteResult(void) {
-}
-
-void USBHAL::EP0stall(void) {
- stallEndpoint(EP0OUT);
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
- endpoint = PHY_TO_LOG(endpoint);
- uint32_t idx = EP_BDT_IDX(endpoint, RX, 0);
- bdt[idx].byte_count = maximumSize;
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
- uint32_t n, sz, idx, setup = 0;
- uint8_t not_iso;
- uint8_t * ep_buf;
-
- uint32_t log_endpoint = PHY_TO_LOG(endpoint);
-
- if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) {
- return EP_INVALID;
- }
-
- // if read on a IN endpoint -> error
- if (IN_EP(endpoint)) {
- return EP_INVALID;
- }
-
- idx = EP_BDT_IDX(log_endpoint, RX, 0);
- sz = bdt[idx].byte_count;
- not_iso = USB0->ENDPOINT[log_endpoint].ENDPT & USB_ENDPT_EPHSHK_MASK;
-
- //for isochronous endpoint, we don't wait an interrupt
- if ((log_endpoint != 0) && not_iso && !(epComplete & EP(endpoint))) {
- return EP_PENDING;
- }
-
- if ((log_endpoint == 0) && (TOK_PID(idx) == SETUP_TOKEN)) {
- setup = 1;
- }
-
- // non iso endpoint
- if (not_iso) {
- ep_buf = endpoint_buffer[idx];
- } else {
- ep_buf = endpoint_buffer_iso[0];
- }
-
- for (n = 0; n < sz; n++) {
- buffer[n] = ep_buf[n];
- }
-
- if (((Data1 >> endpoint) & 1) == ((bdt[idx].info >> 6) & 1)) {
- if (setup && (buffer[6] == 0)) // if no setup data stage,
- Data1 &= ~1UL; // set DATA0
- else
- Data1 ^= (1 << endpoint);
- }
-
- if (((Data1 >> endpoint) & 1)) {
- bdt[idx].info = BD_DTS_MASK | BD_DATA01_MASK | BD_OWN_MASK;
- }
- else {
- bdt[idx].info = BD_DTS_MASK | BD_OWN_MASK;
- }
-
- USB0->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;
- *bytesRead = sz;
-
- epComplete &= ~EP(endpoint);
- return EP_COMPLETED;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
- uint32_t idx, n;
- uint8_t * ep_buf;
-
- if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) {
- return EP_INVALID;
- }
-
- // if write on a OUT endpoint -> error
- if (OUT_EP(endpoint)) {
- return EP_INVALID;
- }
-
- idx = EP_BDT_IDX(PHY_TO_LOG(endpoint), TX, 0);
- bdt[idx].byte_count = size;
-
-
- // non iso endpoint
- if (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPHSHK_MASK) {
- ep_buf = endpoint_buffer[idx];
- } else {
- ep_buf = endpoint_buffer_iso[2];
- }
-
- for (n = 0; n < size; n++) {
- ep_buf[n] = data[n];
- }
-
- if ((Data1 >> endpoint) & 1) {
- bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK;
- } else {
- bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK | BD_DATA01_MASK;
- }
-
- Data1 ^= (1 << endpoint);
-
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
- if (epComplete & EP(endpoint)) {
- epComplete &= ~EP(endpoint);
- return EP_COMPLETED;
- }
-
- return EP_PENDING;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint) {
- USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT |= USB_ENDPT_EPSTALL_MASK;
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint) {
- USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT &= ~USB_ENDPT_EPSTALL_MASK;
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint) {
- uint8_t stall = (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPSTALL_MASK);
- return (stall) ? true : false;
-}
-
-void USBHAL::remoteWakeup(void) {
- // [TODO]
-}
-
-
-void USBHAL::_usbisr(void) {
- instance->usbisr();
-}
-
-
-void USBHAL::usbisr(void) {
- uint8_t i;
- uint8_t istat = USB0->ISTAT;
-
- // reset interrupt
- if (istat & USB_ISTAT_USBRST_MASK) {
- // disable all endpt
- for(i = 0; i < 16; i++) {
- USB0->ENDPOINT[i].ENDPT = 0x00;
- }
-
- // enable control endpoint
- realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
- realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
-
- Data1 = 0x55555555;
- USB0->CTL |= USB_CTL_ODDRST_MASK;
-
- USB0->ISTAT = 0xFF; // clear all interrupt status flags
- USB0->ERRSTAT = 0xFF; // clear all error flags
- USB0->ERREN = 0xFF; // enable error interrupt sources
- USB0->ADDR = 0x00; // set default address
-
- return;
- }
-
- // resume interrupt
- if (istat & USB_ISTAT_RESUME_MASK) {
- USB0->ISTAT = USB_ISTAT_RESUME_MASK;
- }
-
- // SOF interrupt
- if (istat & USB_ISTAT_SOFTOK_MASK) {
- USB0->ISTAT = USB_ISTAT_SOFTOK_MASK;
- // SOF event, read frame number
- SOF(frameNumber());
- }
-
- // stall interrupt
- if (istat & 1<<7) {
- if (USB0->ENDPOINT[0].ENDPT & USB_ENDPT_EPSTALL_MASK)
- USB0->ENDPOINT[0].ENDPT &= ~USB_ENDPT_EPSTALL_MASK;
- USB0->ISTAT |= USB_ISTAT_STALL_MASK;
- }
-
- // token interrupt
- if (istat & 1<<3) {
- uint32_t num = (USB0->STAT >> 4) & 0x0F;
- uint32_t dir = (USB0->STAT >> 3) & 0x01;
- uint32_t ev_odd = (USB0->STAT >> 2) & 0x01;
- int endpoint = (num << 1) | dir;
-
- // setup packet
- if ((num == 0) && (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == SETUP_TOKEN)) {
- Data1 &= ~0x02;
- bdt[EP_BDT_IDX(0, TX, EVEN)].info &= ~BD_OWN_MASK;
- bdt[EP_BDT_IDX(0, TX, ODD)].info &= ~BD_OWN_MASK;
-
- // EP0 SETUP event (SETUP data received)
- EP0setupCallback();
-
- } else {
- // OUT packet
- if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == OUT_TOKEN) {
- if (num == 0)
- EP0out();
- else {
- epComplete |= EP(endpoint);
- if ((instance->*(epCallback[endpoint - 2]))()) {
- epComplete &= ~EP(endpoint);
- }
- }
- }
-
- // IN packet
- if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == IN_TOKEN) {
- if (num == 0) {
- EP0in();
- if (set_addr == 1) {
- USB0->ADDR = addr & 0x7F;
- set_addr = 0;
- }
- }
- else {
- epComplete |= EP(endpoint);
- if ((instance->*(epCallback[endpoint - 2]))()) {
- epComplete &= ~EP(endpoint);
- }
- }
- }
- }
-
- USB0->ISTAT = USB_ISTAT_TOKDNE_MASK;
- }
-
- // sleep interrupt
- if (istat & 1<<4) {
- USB0->ISTAT |= USB_ISTAT_SLEEP_MASK;
- }
-
- // error interrupt
- if (istat & USB_ISTAT_ERROR_MASK) {
- USB0->ERRSTAT = 0xFF;
- USB0->ISTAT |= USB_ISTAT_ERROR_MASK;
- }
-}
-
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBHAL_LPC11U.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,738 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#if defined(TARGET_LPC11UXX) || defined(TARGET_LPC11U6X) || defined(TARGET_LPC1347) || defined(TARGET_LPC1549)
-
-#if defined(TARGET_LPC1347) || defined(TARGET_LPC1549)
-#define USB_IRQ USB_IRQ_IRQn
-#else
-#define USB_IRQ USB_IRQn
-#endif
-
-#include "USBHAL.h"
-
-USBHAL * USBHAL::instance;
-#if defined(TARGET_LPC1549)
-static uint8_t usbmem[2048] __attribute__((aligned(2048)));
-#endif
-
-// Valid physical endpoint numbers are 0 to (NUMBER_OF_PHYSICAL_ENDPOINTS-1)
-#define LAST_PHYSICAL_ENDPOINT (NUMBER_OF_PHYSICAL_ENDPOINTS-1)
-
-// Convert physical endpoint number to register bit
-#define EP(endpoint) (1UL<<endpoint)
-
-// Convert physical to logical
-#define PHY_TO_LOG(endpoint) ((endpoint)>>1)
-
-// Get endpoint direction
-#define IN_EP(endpoint) ((endpoint) & 1U ? true : false)
-#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true)
-
-// USB RAM
-#if defined(TARGET_LPC1549)
-#define USB_RAM_START ((uint32_t)usbmem)
-#define USB_RAM_SIZE sizeof(usbmem)
-#else
-#define USB_RAM_START (0x20004000)
-#define USB_RAM_SIZE (0x00000800)
-#endif
-
-// SYSAHBCLKCTRL
-#if defined(TARGET_LPC1549)
-#define CLK_USB (1UL<<23)
-#else
-#define CLK_USB (1UL<<14)
-#define CLK_USBRAM (1UL<<27)
-#endif
-
-// USB Information register
-#define FRAME_NR(a) ((a) & 0x7ff) // Frame number
-
-// USB Device Command/Status register
-#define DEV_ADDR_MASK (0x7f) // Device address
-#define DEV_ADDR(a) ((a) & DEV_ADDR_MASK)
-#define DEV_EN (1UL<<7) // Device enable
-#define SETUP (1UL<<8) // SETUP token received
-#define PLL_ON (1UL<<9) // PLL enabled in suspend
-#define DCON (1UL<<16) // Device status - connect
-#define DSUS (1UL<<17) // Device status - suspend
-#define DCON_C (1UL<<24) // Connect change
-#define DSUS_C (1UL<<25) // Suspend change
-#define DRES_C (1UL<<26) // Reset change
-#define VBUSDEBOUNCED (1UL<<28) // Vbus detected
-
-// Endpoint Command/Status list
-#define CMDSTS_A (1UL<<31) // Active
-#define CMDSTS_D (1UL<<30) // Disable
-#define CMDSTS_S (1UL<<29) // Stall
-#define CMDSTS_TR (1UL<<28) // Toggle Reset
-#define CMDSTS_RF (1UL<<27) // Rate Feedback mode
-#define CMDSTS_TV (1UL<<27) // Toggle Value
-#define CMDSTS_T (1UL<<26) // Endpoint Type
-#define CMDSTS_NBYTES(n) (((n)&0x3ff)<<16) // Number of bytes
-#define CMDSTS_ADDRESS_OFFSET(a) (((a)>>6)&0xffff) // Buffer start address
-
-#define BYTES_REMAINING(s) (((s)>>16)&0x3ff) // Bytes remaining after transfer
-
-// USB Non-endpoint interrupt sources
-#define FRAME_INT (1UL<<30)
-#define DEV_INT (1UL<<31)
-
-static volatile int epComplete = 0;
-
-// One entry for a double-buffered logical endpoint in the endpoint
-// command/status list. Endpoint 0 is single buffered, out[1] is used
-// for the SETUP packet and in[1] is not used
-typedef struct {
- uint32_t out[2];
- uint32_t in[2];
-} PACKED EP_COMMAND_STATUS;
-
-typedef struct {
- uint8_t out[MAX_PACKET_SIZE_EP0];
- uint8_t in[MAX_PACKET_SIZE_EP0];
- uint8_t setup[SETUP_PACKET_SIZE];
-} PACKED CONTROL_TRANSFER;
-
-typedef struct {
- uint32_t maxPacket;
- uint32_t buffer[2];
- uint32_t options;
-} PACKED EP_STATE;
-
-static volatile EP_STATE endpointState[NUMBER_OF_PHYSICAL_ENDPOINTS];
-
-// Pointer to the endpoint command/status list
-static EP_COMMAND_STATUS *ep = NULL;
-
-// Pointer to endpoint 0 data (IN/OUT and SETUP)
-static CONTROL_TRANSFER *ct = NULL;
-
-// Shadow DEVCMDSTAT register to avoid accidentally clearing flags or
-// initiating a remote wakeup event.
-static volatile uint32_t devCmdStat;
-
-// Pointers used to allocate USB RAM
-static uint32_t usbRamPtr = USB_RAM_START;
-static uint32_t epRamPtr = 0; // Buffers for endpoints > 0 start here
-
-#define ROUND_UP_TO_MULTIPLE(x, m) ((((x)+((m)-1))/(m))*(m))
-
-void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size);
-void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size) {
- if (size > 0) {
- do {
- *dst++ = *src++;
- } while (--size > 0);
- }
-}
-
-
-USBHAL::USBHAL(void) {
- NVIC_DisableIRQ(USB_IRQ);
-
- // fill in callback array
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP1_IN_callback;
- epCallback[2] = &USBHAL::EP2_OUT_callback;
- epCallback[3] = &USBHAL::EP2_IN_callback;
- epCallback[4] = &USBHAL::EP3_OUT_callback;
- epCallback[5] = &USBHAL::EP3_IN_callback;
- epCallback[6] = &USBHAL::EP4_OUT_callback;
- epCallback[7] = &USBHAL::EP4_IN_callback;
-
-#if defined(TARGET_LPC1549)
- /* Set USB PLL input to system oscillator */
- LPC_SYSCON->USBPLLCLKSEL = 0x01;
-
- /* Setup USB PLL (FCLKIN = 12MHz) * 4 = 48MHz
- MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2)
- FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz
- FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */
- LPC_SYSCON->USBPLLCTRL = (0x3 | (1UL << 6));
-
- /* Powerup USB PLL */
- LPC_SYSCON->PDRUNCFG &= ~(CLK_USB);
-
- /* Wait for PLL to lock */
- while(!(LPC_SYSCON->USBPLLSTAT & 0x01));
-
- /* enable USB main clock */
- LPC_SYSCON->USBCLKSEL = 0x02;
- LPC_SYSCON->USBCLKDIV = 1;
-
- /* Enable AHB clock to the USB block. */
- LPC_SYSCON->SYSAHBCLKCTRL1 |= CLK_USB;
-
- /* power UP USB Phy */
- LPC_SYSCON->PDRUNCFG &= ~(1UL << 9);
-
- /* Reset USB block */
- LPC_SYSCON->PRESETCTRL1 |= (CLK_USB);
- LPC_SYSCON->PRESETCTRL1 &= ~(CLK_USB);
-
-#else
- #if defined(TARGET_LPC11U35_401) || defined(TARGET_LPC11U35_501)
- // USB_VBUS input with pull-down
- LPC_IOCON->PIO0_3 = 0x00000009;
- #endif
-
- // nUSB_CONNECT output
- LPC_IOCON->PIO0_6 = 0x00000001;
-
- // Enable clocks (USB registers, USB RAM)
- LPC_SYSCON->SYSAHBCLKCTRL |= CLK_USB | CLK_USBRAM;
-
- // Ensure device disconnected (DCON not set)
- LPC_USB->DEVCMDSTAT = 0;
-#endif
- // to ensure that the USB host sees the device as
- // disconnected if the target CPU is reset.
- wait(0.3);
-
- // Reserve space in USB RAM for endpoint command/status list
- // Must be 256 byte aligned
- usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 256);
- ep = (EP_COMMAND_STATUS *)usbRamPtr;
- usbRamPtr += (sizeof(EP_COMMAND_STATUS) * NUMBER_OF_LOGICAL_ENDPOINTS);
- LPC_USB->EPLISTSTART = (uint32_t)(ep) & 0xffffff00;
-
- // Reserve space in USB RAM for Endpoint 0
- // Must be 64 byte aligned
- usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 64);
- ct = (CONTROL_TRANSFER *)usbRamPtr;
- usbRamPtr += sizeof(CONTROL_TRANSFER);
- LPC_USB->DATABUFSTART =(uint32_t)(ct) & 0xffc00000;
-
- // Setup command/status list for EP0
- ep[0].out[0] = 0;
- ep[0].in[0] = 0;
- ep[0].out[1] = CMDSTS_ADDRESS_OFFSET((uint32_t)ct->setup);
-
- // Route all interrupts to IRQ, some can be routed to
- // USB_FIQ if you wish.
- LPC_USB->INTROUTING = 0;
-
- // Set device address 0, enable USB device, no remote wakeup
- devCmdStat = DEV_ADDR(0) | DEV_EN | DSUS;
- LPC_USB->DEVCMDSTAT = devCmdStat;
-
- // Enable interrupts for device events and EP0
- LPC_USB->INTEN = DEV_INT | EP(EP0IN) | EP(EP0OUT) | FRAME_INT;
- instance = this;
-
- //attach IRQ handler and enable interrupts
- NVIC_SetVector(USB_IRQ, (uint32_t)&_usbisr);
-}
-
-USBHAL::~USBHAL(void) {
- // Ensure device disconnected (DCON not set)
- LPC_USB->DEVCMDSTAT = 0;
- // Disable USB interrupts
- NVIC_DisableIRQ(USB_IRQ);
-}
-
-void USBHAL::connect(void) {
- NVIC_EnableIRQ(USB_IRQ);
- devCmdStat |= DCON;
- LPC_USB->DEVCMDSTAT = devCmdStat;
-}
-
-void USBHAL::disconnect(void) {
- NVIC_DisableIRQ(USB_IRQ);
- devCmdStat &= ~DCON;
- LPC_USB->DEVCMDSTAT = devCmdStat;
-}
-
-void USBHAL::configureDevice(void) {
- // Not required
-}
-
-void USBHAL::unconfigureDevice(void) {
- // Not required
-}
-
-void USBHAL::EP0setup(uint8_t *buffer) {
- // Copy setup packet data
- USBMemCopy(buffer, ct->setup, SETUP_PACKET_SIZE);
-}
-
-void USBHAL::EP0read(void) {
- // Start an endpoint 0 read
-
- // The USB ISR will call USBDevice_EP0out() when a packet has been read,
- // the USBDevice layer then calls USBBusInterface_EP0getReadResult() to
- // read the data.
-
- ep[0].out[0] = CMDSTS_A |CMDSTS_NBYTES(MAX_PACKET_SIZE_EP0) \
- | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out);
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
- // Complete an endpoint 0 read
- uint32_t bytesRead;
-
- // Find how many bytes were read
- bytesRead = MAX_PACKET_SIZE_EP0 - BYTES_REMAINING(ep[0].out[0]);
-
- // Copy data
- USBMemCopy(buffer, ct->out, bytesRead);
- return bytesRead;
-}
-
-
-void USBHAL::EP0readStage(void) {
- // Not required
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
- // Start and endpoint 0 write
-
- // The USB ISR will call USBDevice_EP0in() when the data has
- // been written, the USBDevice layer then calls
- // USBBusInterface_EP0getWriteResult() to complete the transaction.
-
- // Copy data
- USBMemCopy(ct->in, buffer, size);
-
- // Start transfer
- ep[0].in[0] = CMDSTS_A | CMDSTS_NBYTES(size) \
- | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->in);
-}
-
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
- uint8_t bf = 0;
- uint32_t flags = 0;
-
- //check which buffer must be filled
- if (LPC_USB->EPBUFCFG & EP(endpoint)) {
- // Double buffered
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- bf = 1;
- } else {
- bf = 0;
- }
- }
-
- // if isochronous endpoint, T = 1
- if(endpointState[endpoint].options & ISOCHRONOUS)
- {
- flags |= CMDSTS_T;
- }
-
- //Active the endpoint for reading
- ep[PHY_TO_LOG(endpoint)].out[bf] = CMDSTS_A | CMDSTS_NBYTES(maximumSize) \
- | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out) | flags;
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) {
-
- uint8_t bf = 0;
-
- if (!(epComplete & EP(endpoint)))
- return EP_PENDING;
- else {
- epComplete &= ~EP(endpoint);
-
- //check which buffer has been filled
- if (LPC_USB->EPBUFCFG & EP(endpoint)) {
- // Double buffered (here we read the previous buffer which was used)
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- bf = 0;
- } else {
- bf = 1;
- }
- }
-
- // Find how many bytes were read
- *bytesRead = (uint32_t) (endpointState[endpoint].maxPacket - BYTES_REMAINING(ep[PHY_TO_LOG(endpoint)].out[bf]));
-
- // Copy data
- USBMemCopy(data, ct->out, *bytesRead);
- return EP_COMPLETED;
- }
-}
-
-void USBHAL::EP0getWriteResult(void) {
- // Not required
-}
-
-void USBHAL::EP0stall(void) {
- ep[0].in[0] = CMDSTS_S;
- ep[0].out[0] = CMDSTS_S;
-}
-
-void USBHAL::setAddress(uint8_t address) {
- devCmdStat &= ~DEV_ADDR_MASK;
- devCmdStat |= DEV_ADDR(address);
- LPC_USB->DEVCMDSTAT = devCmdStat;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
- uint32_t flags = 0;
- uint32_t bf;
-
- // Validate parameters
- if (data == NULL) {
- return EP_INVALID;
- }
-
- if (endpoint > LAST_PHYSICAL_ENDPOINT) {
- return EP_INVALID;
- }
-
- if ((endpoint==EP0IN) || (endpoint==EP0OUT)) {
- return EP_INVALID;
- }
-
- if (size > endpointState[endpoint].maxPacket) {
- return EP_INVALID;
- }
-
- if (LPC_USB->EPBUFCFG & EP(endpoint)) {
- // Double buffered
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- bf = 1;
- } else {
- bf = 0;
- }
- } else {
- // Single buffered
- bf = 0;
- }
-
- // Check if already active
- if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) {
- return EP_INVALID;
- }
-
- // Check if stalled
- if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) {
- return EP_STALLED;
- }
-
- // Copy data to USB RAM
- USBMemCopy((uint8_t *)endpointState[endpoint].buffer[bf], data, size);
-
- // Add options
- if (endpointState[endpoint].options & RATE_FEEDBACK_MODE) {
- flags |= CMDSTS_RF;
- }
-
- if (endpointState[endpoint].options & ISOCHRONOUS) {
- flags |= CMDSTS_T;
- }
-
- // Add transfer
- ep[PHY_TO_LOG(endpoint)].in[bf] = CMDSTS_ADDRESS_OFFSET( \
- endpointState[endpoint].buffer[bf]) \
- | CMDSTS_NBYTES(size) | CMDSTS_A | flags;
-
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
- uint32_t bf;
-
- // Validate parameters
- if (endpoint > LAST_PHYSICAL_ENDPOINT) {
- return EP_INVALID;
- }
-
- if (OUT_EP(endpoint)) {
- return EP_INVALID;
- }
-
- if (LPC_USB->EPBUFCFG & EP(endpoint)) {
- // Double buffered // TODO: FIX THIS
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- bf = 1;
- } else {
- bf = 0;
- }
- } else {
- // Single buffered
- bf = 0;
- }
-
- // Check if endpoint still active
- if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) {
- return EP_PENDING;
- }
-
- // Check if stalled
- if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) {
- return EP_STALLED;
- }
-
- return EP_COMPLETED;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint) {
-
- // FIX: should this clear active bit?
- if (IN_EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].in[0] |= CMDSTS_S;
- ep[PHY_TO_LOG(endpoint)].in[1] |= CMDSTS_S;
- } else {
- ep[PHY_TO_LOG(endpoint)].out[0] |= CMDSTS_S;
- ep[PHY_TO_LOG(endpoint)].out[1] |= CMDSTS_S;
- }
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint) {
- if (LPC_USB->EPBUFCFG & EP(endpoint)) {
- // Double buffered
- if (IN_EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].in[0] = 0; // S = 0
- ep[PHY_TO_LOG(endpoint)].in[1] = 0; // S = 0
-
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].in[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
- } else {
- ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
- }
- } else {
- ep[PHY_TO_LOG(endpoint)].out[0] = 0; // S = 0
- ep[PHY_TO_LOG(endpoint)].out[1] = 0; // S = 0
-
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].out[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
- } else {
- ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
- }
- }
- } else {
- // Single buffered
- if (IN_EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
- } else {
- ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
- }
- }
-}
-
-bool USBHAL::getEndpointStallState(unsigned char endpoint) {
- if (IN_EP(endpoint)) {
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- if (ep[PHY_TO_LOG(endpoint)].in[1] & CMDSTS_S) {
- return true;
- }
- } else {
- if (ep[PHY_TO_LOG(endpoint)].in[0] & CMDSTS_S) {
- return true;
- }
- }
- } else {
- if (LPC_USB->EPINUSE & EP(endpoint)) {
- if (ep[PHY_TO_LOG(endpoint)].out[1] & CMDSTS_S) {
- return true;
- }
- } else {
- if (ep[PHY_TO_LOG(endpoint)].out[0] & CMDSTS_S) {
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) {
- uint32_t tmpEpRamPtr;
-
- if (endpoint > LAST_PHYSICAL_ENDPOINT) {
- return false;
- }
-
- // Not applicable to the control endpoints
- if ((endpoint==EP0IN) || (endpoint==EP0OUT)) {
- return false;
- }
-
- // Allocate buffers in USB RAM
- tmpEpRamPtr = epRamPtr;
-
- // Must be 64 byte aligned
- tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64);
-
- if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) {
- // Out of memory
- return false;
- }
-
- // Allocate first buffer
- endpointState[endpoint].buffer[0] = tmpEpRamPtr;
- tmpEpRamPtr += maxPacket;
-
- if (!(options & SINGLE_BUFFERED)) {
- // Must be 64 byte aligned
- tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64);
-
- if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) {
- // Out of memory
- return false;
- }
-
- // Allocate second buffer
- endpointState[endpoint].buffer[1] = tmpEpRamPtr;
- tmpEpRamPtr += maxPacket;
- }
-
- // Commit to this USB RAM allocation
- epRamPtr = tmpEpRamPtr;
-
- // Remaining endpoint state values
- endpointState[endpoint].maxPacket = maxPacket;
- endpointState[endpoint].options = options;
-
- // Enable double buffering if required
- if (options & SINGLE_BUFFERED) {
- LPC_USB->EPBUFCFG &= ~EP(endpoint);
- } else {
- // Double buffered
- LPC_USB->EPBUFCFG |= EP(endpoint);
- }
-
- // Enable interrupt
- LPC_USB->INTEN |= EP(endpoint);
-
- // Enable endpoint
- unstallEndpoint(endpoint);
- return true;
-}
-
-void USBHAL::remoteWakeup(void) {
- // Clearing DSUS bit initiates a remote wakeup if the
- // device is currently enabled and suspended - otherwise
- // it has no effect.
- LPC_USB->DEVCMDSTAT = devCmdStat & ~DSUS;
-}
-
-
-static void disableEndpoints(void) {
- uint32_t logEp;
-
- // Ref. Table 158 "When a bus reset is received, software
- // must set the disable bit of all endpoints to 1".
-
- for (logEp = 1; logEp < NUMBER_OF_LOGICAL_ENDPOINTS; logEp++) {
- ep[logEp].out[0] = CMDSTS_D;
- ep[logEp].out[1] = CMDSTS_D;
- ep[logEp].in[0] = CMDSTS_D;
- ep[logEp].in[1] = CMDSTS_D;
- }
-
- // Start of USB RAM for endpoints > 0
- epRamPtr = usbRamPtr;
-}
-
-
-
-void USBHAL::_usbisr(void) {
- instance->usbisr();
-}
-
-void USBHAL::usbisr(void) {
- // Start of frame
- if (LPC_USB->INTSTAT & FRAME_INT) {
- // Clear SOF interrupt
- LPC_USB->INTSTAT = FRAME_INT;
-
- // SOF event, read frame number
- SOF(FRAME_NR(LPC_USB->INFO));
- }
-
- // Device state
- if (LPC_USB->INTSTAT & DEV_INT) {
- LPC_USB->INTSTAT = DEV_INT;
-
- if (LPC_USB->DEVCMDSTAT & DSUS_C) {
- // Suspend status changed
- LPC_USB->DEVCMDSTAT = devCmdStat | DSUS_C;
- if (LPC_USB->DEVCMDSTAT & DSUS) {
- suspendStateChanged(1);
- } else {
- suspendStateChanged(0);
- }
- }
-
- if (LPC_USB->DEVCMDSTAT & DRES_C) {
- // Bus reset
- LPC_USB->DEVCMDSTAT = devCmdStat | DRES_C;
-
- // Disable endpoints > 0
- disableEndpoints();
-
- // Bus reset event
- busReset();
- }
- }
-
- // Endpoint 0
- if (LPC_USB->INTSTAT & EP(EP0OUT)) {
- // Clear EP0OUT/SETUP interrupt
- LPC_USB->INTSTAT = EP(EP0OUT);
-
- // Check if SETUP
- if (LPC_USB->DEVCMDSTAT & SETUP) {
- // Clear Active and Stall bits for EP0
- // Documentation does not make it clear if we must use the
- // EPSKIP register to achieve this, Fig. 16 and NXP reference
- // code suggests we can just clear the Active bits - check with
- // NXP to be sure.
- ep[0].in[0] = 0;
- ep[0].out[0] = 0;
-
- // Clear EP0IN interrupt
- LPC_USB->INTSTAT = EP(EP0IN);
-
- // Clear SETUP (and INTONNAK_CI/O) in device status register
- LPC_USB->DEVCMDSTAT = devCmdStat | SETUP;
-
- // EP0 SETUP event (SETUP data received)
- EP0setupCallback();
- } else {
- // EP0OUT ACK event (OUT data received)
- EP0out();
- }
- }
-
- if (LPC_USB->INTSTAT & EP(EP0IN)) {
- // Clear EP0IN interrupt
- LPC_USB->INTSTAT = EP(EP0IN);
-
- // EP0IN ACK event (IN data sent)
- EP0in();
- }
-
- for (uint8_t num = 2; num < 5*2; num++) {
- if (LPC_USB->INTSTAT & EP(num)) {
- LPC_USB->INTSTAT = EP(num);
- epComplete |= EP(num);
- if ((instance->*(epCallback[num - 2]))()) {
- epComplete &= ~EP(num);
- }
- }
- }
-}
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBHAL_LPC17.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,623 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC2460)
-
-#include "USBHAL.h"
-
-
-// Get endpoint direction
-#define IN_EP(endpoint) ((endpoint) & 1U ? true : false)
-#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true)
-
-// Convert physical endpoint number to register bit
-#define EP(endpoint) (1UL<<endpoint)
-
-// Power Control for Peripherals register
-#define PCUSB (1UL<<31)
-
-// USB Clock Control register
-#define DEV_CLK_EN (1UL<<1)
-#define AHB_CLK_EN (1UL<<4)
-
-// USB Clock Status register
-#define DEV_CLK_ON (1UL<<1)
-#define AHB_CLK_ON (1UL<<4)
-
-// USB Device Interupt registers
-#define FRAME (1UL<<0)
-#define EP_FAST (1UL<<1)
-#define EP_SLOW (1UL<<2)
-#define DEV_STAT (1UL<<3)
-#define CCEMPTY (1UL<<4)
-#define CDFULL (1UL<<5)
-#define RxENDPKT (1UL<<6)
-#define TxENDPKT (1UL<<7)
-#define EP_RLZED (1UL<<8)
-#define ERR_INT (1UL<<9)
-
-// USB Control register
-#define RD_EN (1<<0)
-#define WR_EN (1<<1)
-#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2)
-
-// USB Receive Packet Length register
-#define DV (1UL<<10)
-#define PKT_RDY (1UL<<11)
-#define PKT_LNGTH_MASK (0x3ff)
-
-// Serial Interface Engine (SIE)
-#define SIE_WRITE (0x01)
-#define SIE_READ (0x02)
-#define SIE_COMMAND (0x05)
-#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16))
-
-// SIE Command codes
-#define SIE_CMD_SET_ADDRESS (0xD0)
-#define SIE_CMD_CONFIGURE_DEVICE (0xD8)
-#define SIE_CMD_SET_MODE (0xF3)
-#define SIE_CMD_READ_FRAME_NUMBER (0xF5)
-#define SIE_CMD_READ_TEST_REGISTER (0xFD)
-#define SIE_CMD_SET_DEVICE_STATUS (0xFE)
-#define SIE_CMD_GET_DEVICE_STATUS (0xFE)
-#define SIE_CMD_GET_ERROR_CODE (0xFF)
-#define SIE_CMD_READ_ERROR_STATUS (0xFB)
-
-#define SIE_CMD_SELECT_ENDPOINT(endpoint) (0x00+endpoint)
-#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint)
-#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint) (0x40+endpoint)
-
-#define SIE_CMD_CLEAR_BUFFER (0xF2)
-#define SIE_CMD_VALIDATE_BUFFER (0xFA)
-
-// SIE Device Status register
-#define SIE_DS_CON (1<<0)
-#define SIE_DS_CON_CH (1<<1)
-#define SIE_DS_SUS (1<<2)
-#define SIE_DS_SUS_CH (1<<3)
-#define SIE_DS_RST (1<<4)
-
-// SIE Device Set Address register
-#define SIE_DSA_DEV_EN (1<<7)
-
-// SIE Configue Device register
-#define SIE_CONF_DEVICE (1<<0)
-
-// Select Endpoint register
-#define SIE_SE_FE (1<<0)
-#define SIE_SE_ST (1<<1)
-#define SIE_SE_STP (1<<2)
-#define SIE_SE_PO (1<<3)
-#define SIE_SE_EPN (1<<4)
-#define SIE_SE_B_1_FULL (1<<5)
-#define SIE_SE_B_2_FULL (1<<6)
-
-// Set Endpoint Status command
-#define SIE_SES_ST (1<<0)
-#define SIE_SES_DA (1<<5)
-#define SIE_SES_RF_MO (1<<6)
-#define SIE_SES_CND_ST (1<<7)
-
-
-USBHAL * USBHAL::instance;
-
-static volatile int epComplete;
-static uint32_t endpointStallState;
-
-static void SIECommand(uint32_t command) {
- // The command phase of a SIE transaction
- LPC_USB->USBDevIntClr = CCEMPTY;
- LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_COMMAND, command);
- while (!(LPC_USB->USBDevIntSt & CCEMPTY));
-}
-
-static void SIEWriteData(uint8_t data) {
- // The data write phase of a SIE transaction
- LPC_USB->USBDevIntClr = CCEMPTY;
- LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_WRITE, data);
- while (!(LPC_USB->USBDevIntSt & CCEMPTY));
-}
-
-static uint8_t SIEReadData(uint32_t command) {
- // The data read phase of a SIE transaction
- LPC_USB->USBDevIntClr = CDFULL;
- LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_READ, command);
- while (!(LPC_USB->USBDevIntSt & CDFULL));
- return (uint8_t)LPC_USB->USBCmdData;
-}
-
-static void SIEsetDeviceStatus(uint8_t status) {
- // Write SIE device status register
- SIECommand(SIE_CMD_SET_DEVICE_STATUS);
- SIEWriteData(status);
-}
-
-static uint8_t SIEgetDeviceStatus(void) {
- // Read SIE device status register
- SIECommand(SIE_CMD_GET_DEVICE_STATUS);
- return SIEReadData(SIE_CMD_GET_DEVICE_STATUS);
-}
-
-void SIEsetAddress(uint8_t address) {
- // Write SIE device address register
- SIECommand(SIE_CMD_SET_ADDRESS);
- SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN);
-}
-
-static uint8_t SIEselectEndpoint(uint8_t endpoint) {
- // SIE select endpoint command
- SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint));
- return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint));
-}
-
-static uint8_t SIEclearBuffer(void) {
- // SIE clear buffer command
- SIECommand(SIE_CMD_CLEAR_BUFFER);
- return SIEReadData(SIE_CMD_CLEAR_BUFFER);
-}
-
-static void SIEvalidateBuffer(void) {
- // SIE validate buffer command
- SIECommand(SIE_CMD_VALIDATE_BUFFER);
-}
-
-static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) {
- // SIE set endpoint status command
- SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint));
- SIEWriteData(status);
-}
-
-static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused));
-static uint16_t SIEgetFrameNumber(void) {
- // Read current frame number
- uint16_t lowByte;
- uint16_t highByte;
-
- SIECommand(SIE_CMD_READ_FRAME_NUMBER);
- lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
- highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
-
- return (highByte << 8) | lowByte;
-}
-
-static void SIEconfigureDevice(void) {
- // SIE Configure device command
- SIECommand(SIE_CMD_CONFIGURE_DEVICE);
- SIEWriteData(SIE_CONF_DEVICE);
-}
-
-static void SIEunconfigureDevice(void) {
- // SIE Configure device command
- SIECommand(SIE_CMD_CONFIGURE_DEVICE);
- SIEWriteData(0);
-}
-
-static void SIEconnect(void) {
- // Connect USB device
- uint8_t status = SIEgetDeviceStatus();
- SIEsetDeviceStatus(status | SIE_DS_CON);
-}
-
-
-static void SIEdisconnect(void) {
- // Disconnect USB device
- uint8_t status = SIEgetDeviceStatus();
- SIEsetDeviceStatus(status & ~SIE_DS_CON);
-}
-
-
-static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) {
- // Implemented using using EP_INT_CLR.
- LPC_USB->USBEpIntClr = EP(endpoint);
- while (!(LPC_USB->USBDevIntSt & CDFULL));
- return (uint8_t)LPC_USB->USBCmdData;
-}
-
-
-static void enableEndpointEvent(uint8_t endpoint) {
- // Enable an endpoint interrupt
- LPC_USB->USBEpIntEn |= EP(endpoint);
-}
-
-static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused));
-static void disableEndpointEvent(uint8_t endpoint) {
- // Disable an endpoint interrupt
- LPC_USB->USBEpIntEn &= ~EP(endpoint);
-}
-
-static volatile uint32_t __attribute__((used)) dummyRead;
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
- // Read from an OUT endpoint
- uint32_t size;
- uint32_t i;
- uint32_t data = 0;
- uint8_t offset;
-
- LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | RD_EN;
- while (!(LPC_USB->USBRxPLen & PKT_RDY));
-
- size = LPC_USB->USBRxPLen & PKT_LNGTH_MASK;
-
- offset = 0;
-
- if (size > 0) {
- for (i=0; i<size; i++) {
- if (offset==0) {
- // Fetch up to four bytes of data as a word
- data = LPC_USB->USBRxData;
- }
-
- // extract a byte
- *buffer = (data>>offset) & 0xff;
- buffer++;
-
- // move on to the next byte
- offset = (offset + 8) % 32;
- }
- } else {
- dummyRead = LPC_USB->USBRxData;
- }
-
- LPC_USB->USBCtrl = 0;
-
- if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
- SIEselectEndpoint(endpoint);
- SIEclearBuffer();
- }
-
- return size;
-}
-
-static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) {
- // Write to an IN endpoint
- uint32_t temp, data;
- uint8_t offset;
-
- LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | WR_EN;
-
- LPC_USB->USBTxPLen = size;
- offset = 0;
- data = 0;
-
- if (size>0) {
- do {
- // Fetch next data byte into a word-sized temporary variable
- temp = *buffer++;
-
- // Add to current data word
- temp = temp << offset;
- data = data | temp;
-
- // move on to the next byte
- offset = (offset + 8) % 32;
- size--;
-
- if ((offset==0) || (size==0)) {
- // Write the word to the endpoint
- LPC_USB->USBTxData = data;
- data = 0;
- }
- } while (size>0);
- } else {
- LPC_USB->USBTxData = 0;
- }
-
- // Clear WR_EN to cover zero length packet case
- LPC_USB->USBCtrl=0;
-
- SIEselectEndpoint(endpoint);
- SIEvalidateBuffer();
-}
-
-USBHAL::USBHAL(void) {
- // Disable IRQ
- NVIC_DisableIRQ(USB_IRQn);
-
- // fill in callback array
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP1_IN_callback;
- epCallback[2] = &USBHAL::EP2_OUT_callback;
- epCallback[3] = &USBHAL::EP2_IN_callback;
- epCallback[4] = &USBHAL::EP3_OUT_callback;
- epCallback[5] = &USBHAL::EP3_IN_callback;
- epCallback[6] = &USBHAL::EP4_OUT_callback;
- epCallback[7] = &USBHAL::EP4_IN_callback;
- epCallback[8] = &USBHAL::EP5_OUT_callback;
- epCallback[9] = &USBHAL::EP5_IN_callback;
- epCallback[10] = &USBHAL::EP6_OUT_callback;
- epCallback[11] = &USBHAL::EP6_IN_callback;
- epCallback[12] = &USBHAL::EP7_OUT_callback;
- epCallback[13] = &USBHAL::EP7_IN_callback;
- epCallback[14] = &USBHAL::EP8_OUT_callback;
- epCallback[15] = &USBHAL::EP8_IN_callback;
- epCallback[16] = &USBHAL::EP9_OUT_callback;
- epCallback[17] = &USBHAL::EP9_IN_callback;
- epCallback[18] = &USBHAL::EP10_OUT_callback;
- epCallback[19] = &USBHAL::EP10_IN_callback;
- epCallback[20] = &USBHAL::EP11_OUT_callback;
- epCallback[21] = &USBHAL::EP11_IN_callback;
- epCallback[22] = &USBHAL::EP12_OUT_callback;
- epCallback[23] = &USBHAL::EP12_IN_callback;
- epCallback[24] = &USBHAL::EP13_OUT_callback;
- epCallback[25] = &USBHAL::EP13_IN_callback;
- epCallback[26] = &USBHAL::EP14_OUT_callback;
- epCallback[27] = &USBHAL::EP14_IN_callback;
- epCallback[28] = &USBHAL::EP15_OUT_callback;
- epCallback[29] = &USBHAL::EP15_IN_callback;
-
- // Enable power to USB device controller
- LPC_SC->PCONP |= PCUSB;
-
- // Enable USB clocks
- LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;
- while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));
-
- // Configure pins P0.29 and P0.30 to be USB D+ and USB D-
- LPC_PINCON->PINSEL1 &= 0xc3ffffff;
- LPC_PINCON->PINSEL1 |= 0x14000000;
-
- // Disconnect USB device
- SIEdisconnect();
-
- // Configure pin P2.9 to be Connect
- LPC_PINCON->PINSEL4 &= 0xfffcffff;
- LPC_PINCON->PINSEL4 |= 0x00040000;
-
- // Connect must be low for at least 2.5uS
- wait(0.3);
-
- // Set the maximum packet size for the control endpoints
- realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
- realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
-
- // Attach IRQ
- instance = this;
- NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);
-
- // Enable interrupts for device events and EP0
- LPC_USB->USBDevIntEn = EP_SLOW | DEV_STAT | FRAME;
- enableEndpointEvent(EP0IN);
- enableEndpointEvent(EP0OUT);
-}
-
-USBHAL::~USBHAL(void) {
- // Ensure device disconnected
- SIEdisconnect();
- // Disable USB interrupts
- NVIC_DisableIRQ(USB_IRQn);
-}
-
-void USBHAL::connect(void) {
- NVIC_EnableIRQ(USB_IRQn);
- // Connect USB device
- SIEconnect();
-}
-
-void USBHAL::disconnect(void) {
- NVIC_DisableIRQ(USB_IRQn);
- // Disconnect USB device
- SIEdisconnect();
-}
-
-void USBHAL::configureDevice(void) {
- SIEconfigureDevice();
-}
-
-void USBHAL::unconfigureDevice(void) {
- SIEunconfigureDevice();
-}
-
-void USBHAL::setAddress(uint8_t address) {
- SIEsetAddress(address);
-}
-
-void USBHAL::EP0setup(uint8_t *buffer) {
- endpointReadcore(EP0OUT, buffer);
-}
-
-void USBHAL::EP0read(void) {
- // Not required
-}
-
-void USBHAL::EP0readStage(void) {
- // Not required
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
- return endpointReadcore(EP0OUT, buffer);
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
- endpointWritecore(EP0IN, buffer, size);
-}
-
-void USBHAL::EP0getWriteResult(void) {
- // Not required
-}
-
-void USBHAL::EP0stall(void) {
- // This will stall both control endpoints
- stallEndpoint(EP0OUT);
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
-
- //for isochronous endpoint, we don't wait an interrupt
- if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
- if (!(epComplete & EP(endpoint)))
- return EP_PENDING;
- }
-
- *bytesRead = endpointReadcore(endpoint, buffer);
- epComplete &= ~EP(endpoint);
- return EP_COMPLETED;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
- if (getEndpointStallState(endpoint)) {
- return EP_STALLED;
- }
-
- epComplete &= ~EP(endpoint);
-
- endpointWritecore(endpoint, data, size);
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
- if (epComplete & EP(endpoint)) {
- epComplete &= ~EP(endpoint);
- return EP_COMPLETED;
- }
-
- return EP_PENDING;
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
- // Realise an endpoint
- LPC_USB->USBDevIntClr = EP_RLZED;
- LPC_USB->USBReEp |= EP(endpoint);
- LPC_USB->USBEpInd = endpoint;
- LPC_USB->USBMaxPSize = maxPacket;
-
- while (!(LPC_USB->USBDevIntSt & EP_RLZED));
- LPC_USB->USBDevIntClr = EP_RLZED;
-
- // Clear stall state
- endpointStallState &= ~EP(endpoint);
-
- enableEndpointEvent(endpoint);
- return true;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint) {
- // Stall an endpoint
- if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) {
- // Conditionally stall both control endpoints
- SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST);
- } else {
- SIEsetEndpointStatus(endpoint, SIE_SES_ST);
-
- // Update stall state
- endpointStallState |= EP(endpoint);
- }
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint) {
- // Unstall an endpoint. The endpoint will also be reinitialised
- SIEsetEndpointStatus(endpoint, 0);
-
- // Update stall state
- endpointStallState &= ~EP(endpoint);
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint) {
- // Returns true if endpoint stalled
- return endpointStallState & EP(endpoint);
-}
-
-void USBHAL::remoteWakeup(void) {
- // Remote wakeup
- uint8_t status;
-
- // Enable USB clocks
- LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;
- while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));
-
- status = SIEgetDeviceStatus();
- SIEsetDeviceStatus(status & ~SIE_DS_SUS);
-}
-
-void USBHAL::_usbisr(void) {
- instance->usbisr();
-}
-
-
-void USBHAL::usbisr(void) {
- uint8_t devStat;
-
- if (LPC_USB->USBDevIntSt & FRAME) {
- // Start of frame event
- SOF(SIEgetFrameNumber());
- // Clear interrupt status flag
- LPC_USB->USBDevIntClr = FRAME;
- }
-
- if (LPC_USB->USBDevIntSt & DEV_STAT) {
- // Device Status interrupt
- // Must clear the interrupt status flag before reading the device status from the SIE
- LPC_USB->USBDevIntClr = DEV_STAT;
-
- // Read device status from SIE
- devStat = SIEgetDeviceStatus();
- //printf("devStat: %d\r\n", devStat);
-
- if (devStat & SIE_DS_SUS_CH) {
- // Suspend status changed
- if((devStat & SIE_DS_SUS) != 0) {
- suspendStateChanged(0);
- }
- }
-
- if (devStat & SIE_DS_RST) {
- // Bus reset
- if((devStat & SIE_DS_SUS) == 0) {
- suspendStateChanged(1);
- }
- busReset();
- }
- }
-
- if (LPC_USB->USBDevIntSt & EP_SLOW) {
- // (Slow) Endpoint Interrupt
-
- // Process each endpoint interrupt
- if (LPC_USB->USBEpIntSt & EP(EP0OUT)) {
- if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) {
- // this is a setup packet
- EP0setupCallback();
- } else {
- EP0out();
- }
- LPC_USB->USBDevIntClr = EP_SLOW;
- }
-
- if (LPC_USB->USBEpIntSt & EP(EP0IN)) {
- selectEndpointClearInterrupt(EP0IN);
- LPC_USB->USBDevIntClr = EP_SLOW;
- EP0in();
- }
-
- for (uint8_t num = 2; num < 16*2; num++) {
- if (LPC_USB->USBEpIntSt & EP(num)) {
- selectEndpointClearInterrupt(num);
- epComplete |= EP(num);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if ((instance->*(epCallback[num - 2]))()) {
- epComplete &= ~EP(num);
- }
- }
- }
- }
-}
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBHAL_LPC40.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,628 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#if defined(TARGET_LPC4088) || defined(TARGET_LPC4088_DM)
-
-#include "USBHAL.h"
-
-
-// Get endpoint direction
-#define IN_EP(endpoint) ((endpoint) & 1U ? true : false)
-#define OUT_EP(endpoint) ((endpoint) & 1U ? false : true)
-
-// Convert physical endpoint number to register bit
-#define EP(endpoint) (1UL<<endpoint)
-
-// Power Control for Peripherals register
-#define PCUSB (1UL<<31)
-
-// USB Clock Control register
-#define DEV_CLK_EN (1UL<<1)
-#define PORT_CLK_EN (1UL<<3)
-#define AHB_CLK_EN (1UL<<4)
-
-// USB Clock Status register
-#define DEV_CLK_ON (1UL<<1)
-#define AHB_CLK_ON (1UL<<4)
-
-// USB Device Interupt registers
-#define FRAME (1UL<<0)
-#define EP_FAST (1UL<<1)
-#define EP_SLOW (1UL<<2)
-#define DEV_STAT (1UL<<3)
-#define CCEMPTY (1UL<<4)
-#define CDFULL (1UL<<5)
-#define RxENDPKT (1UL<<6)
-#define TxENDPKT (1UL<<7)
-#define EP_RLZED (1UL<<8)
-#define ERR_INT (1UL<<9)
-
-// USB Control register
-#define RD_EN (1<<0)
-#define WR_EN (1<<1)
-#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2)
-
-// USB Receive Packet Length register
-#define DV (1UL<<10)
-#define PKT_RDY (1UL<<11)
-#define PKT_LNGTH_MASK (0x3ff)
-
-// Serial Interface Engine (SIE)
-#define SIE_WRITE (0x01)
-#define SIE_READ (0x02)
-#define SIE_COMMAND (0x05)
-#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16))
-
-// SIE Command codes
-#define SIE_CMD_SET_ADDRESS (0xD0)
-#define SIE_CMD_CONFIGURE_DEVICE (0xD8)
-#define SIE_CMD_SET_MODE (0xF3)
-#define SIE_CMD_READ_FRAME_NUMBER (0xF5)
-#define SIE_CMD_READ_TEST_REGISTER (0xFD)
-#define SIE_CMD_SET_DEVICE_STATUS (0xFE)
-#define SIE_CMD_GET_DEVICE_STATUS (0xFE)
-#define SIE_CMD_GET_ERROR_CODE (0xFF)
-#define SIE_CMD_READ_ERROR_STATUS (0xFB)
-
-#define SIE_CMD_SELECT_ENDPOINT(endpoint) (0x00+endpoint)
-#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint)
-#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint) (0x40+endpoint)
-
-#define SIE_CMD_CLEAR_BUFFER (0xF2)
-#define SIE_CMD_VALIDATE_BUFFER (0xFA)
-
-// SIE Device Status register
-#define SIE_DS_CON (1<<0)
-#define SIE_DS_CON_CH (1<<1)
-#define SIE_DS_SUS (1<<2)
-#define SIE_DS_SUS_CH (1<<3)
-#define SIE_DS_RST (1<<4)
-
-// SIE Device Set Address register
-#define SIE_DSA_DEV_EN (1<<7)
-
-// SIE Configue Device register
-#define SIE_CONF_DEVICE (1<<0)
-
-// Select Endpoint register
-#define SIE_SE_FE (1<<0)
-#define SIE_SE_ST (1<<1)
-#define SIE_SE_STP (1<<2)
-#define SIE_SE_PO (1<<3)
-#define SIE_SE_EPN (1<<4)
-#define SIE_SE_B_1_FULL (1<<5)
-#define SIE_SE_B_2_FULL (1<<6)
-
-// Set Endpoint Status command
-#define SIE_SES_ST (1<<0)
-#define SIE_SES_DA (1<<5)
-#define SIE_SES_RF_MO (1<<6)
-#define SIE_SES_CND_ST (1<<7)
-
-
-USBHAL * USBHAL::instance;
-
-static volatile int epComplete;
-static uint32_t endpointStallState;
-
-static void SIECommand(uint32_t command) {
- // The command phase of a SIE transaction
- LPC_USB->DevIntClr = CCEMPTY;
- LPC_USB->CmdCode = SIE_CMD_CODE(SIE_COMMAND, command);
- while (!(LPC_USB->DevIntSt & CCEMPTY));
-}
-
-static void SIEWriteData(uint8_t data) {
- // The data write phase of a SIE transaction
- LPC_USB->DevIntClr = CCEMPTY;
- LPC_USB->CmdCode = SIE_CMD_CODE(SIE_WRITE, data);
- while (!(LPC_USB->DevIntSt & CCEMPTY));
-}
-
-static uint8_t SIEReadData(uint32_t command) {
- // The data read phase of a SIE transaction
- LPC_USB->DevIntClr = CDFULL;
- LPC_USB->CmdCode = SIE_CMD_CODE(SIE_READ, command);
- while (!(LPC_USB->DevIntSt & CDFULL));
- return (uint8_t)LPC_USB->CmdData;
-}
-
-static void SIEsetDeviceStatus(uint8_t status) {
- // Write SIE device status register
- SIECommand(SIE_CMD_SET_DEVICE_STATUS);
- SIEWriteData(status);
-}
-
-static uint8_t SIEgetDeviceStatus(void) {
- // Read SIE device status register
- SIECommand(SIE_CMD_GET_DEVICE_STATUS);
- return SIEReadData(SIE_CMD_GET_DEVICE_STATUS);
-}
-
-void SIEsetAddress(uint8_t address) {
- // Write SIE device address register
- SIECommand(SIE_CMD_SET_ADDRESS);
- SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN);
-}
-
-static uint8_t SIEselectEndpoint(uint8_t endpoint) {
- // SIE select endpoint command
- SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint));
- return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint));
-}
-
-static uint8_t SIEclearBuffer(void) {
- // SIE clear buffer command
- SIECommand(SIE_CMD_CLEAR_BUFFER);
- return SIEReadData(SIE_CMD_CLEAR_BUFFER);
-}
-
-static void SIEvalidateBuffer(void) {
- // SIE validate buffer command
- SIECommand(SIE_CMD_VALIDATE_BUFFER);
-}
-
-static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) {
- // SIE set endpoint status command
- SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint));
- SIEWriteData(status);
-}
-
-static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused));
-static uint16_t SIEgetFrameNumber(void) {
- // Read current frame number
- uint16_t lowByte;
- uint16_t highByte;
-
- SIECommand(SIE_CMD_READ_FRAME_NUMBER);
- lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
- highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);
-
- return (highByte << 8) | lowByte;
-}
-
-static void SIEconfigureDevice(void) {
- // SIE Configure device command
- SIECommand(SIE_CMD_CONFIGURE_DEVICE);
- SIEWriteData(SIE_CONF_DEVICE);
-}
-
-static void SIEunconfigureDevice(void) {
- // SIE Configure device command
- SIECommand(SIE_CMD_CONFIGURE_DEVICE);
- SIEWriteData(0);
-}
-
-static void SIEconnect(void) {
- // Connect USB device
- uint8_t status = SIEgetDeviceStatus();
- SIEsetDeviceStatus(status | SIE_DS_CON);
-}
-
-
-static void SIEdisconnect(void) {
- // Disconnect USB device
- uint8_t status = SIEgetDeviceStatus();
- SIEsetDeviceStatus(status & ~SIE_DS_CON);
-}
-
-
-static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) {
- // Implemented using using EP_INT_CLR.
- LPC_USB->EpIntClr = EP(endpoint);
- while (!(LPC_USB->DevIntSt & CDFULL));
- return (uint8_t)LPC_USB->CmdData;
-}
-
-
-static void enableEndpointEvent(uint8_t endpoint) {
- // Enable an endpoint interrupt
- LPC_USB->EpIntEn |= EP(endpoint);
-}
-
-static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused));
-static void disableEndpointEvent(uint8_t endpoint) {
- // Disable an endpoint interrupt
- LPC_USB->EpIntEn &= ~EP(endpoint);
-}
-
-static volatile uint32_t __attribute__((used)) dummyRead;
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
- // Read from an OUT endpoint
- uint32_t size;
- uint32_t i;
- uint32_t data = 0;
- uint8_t offset;
-
- LPC_USB->Ctrl = LOG_ENDPOINT(endpoint) | RD_EN;
- while (!(LPC_USB->RxPLen & PKT_RDY));
-
- size = LPC_USB->RxPLen & PKT_LNGTH_MASK;
-
- offset = 0;
-
- if (size > 0) {
- for (i=0; i<size; i++) {
- if (offset==0) {
- // Fetch up to four bytes of data as a word
- data = LPC_USB->RxData;
- }
-
- // extract a byte
- *buffer = (data>>offset) & 0xff;
- buffer++;
-
- // move on to the next byte
- offset = (offset + 8) % 32;
- }
- } else {
- dummyRead = LPC_USB->RxData;
- }
-
- LPC_USB->Ctrl = 0;
-
- if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
- SIEselectEndpoint(endpoint);
- SIEclearBuffer();
- }
-
- return size;
-}
-
-static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) {
- // Write to an IN endpoint
- uint32_t temp, data;
- uint8_t offset;
-
- LPC_USB->Ctrl = LOG_ENDPOINT(endpoint) | WR_EN;
-
- LPC_USB->TxPLen = size;
- offset = 0;
- data = 0;
-
- if (size>0) {
- do {
- // Fetch next data byte into a word-sized temporary variable
- temp = *buffer++;
-
- // Add to current data word
- temp = temp << offset;
- data = data | temp;
-
- // move on to the next byte
- offset = (offset + 8) % 32;
- size--;
-
- if ((offset==0) || (size==0)) {
- // Write the word to the endpoint
- LPC_USB->TxData = data;
- data = 0;
- }
- } while (size>0);
- } else {
- LPC_USB->TxData = 0;
- }
-
- // Clear WR_EN to cover zero length packet case
- LPC_USB->Ctrl=0;
-
- SIEselectEndpoint(endpoint);
- SIEvalidateBuffer();
-}
-
-USBHAL::USBHAL(void) {
- // Disable IRQ
- NVIC_DisableIRQ(USB_IRQn);
-
- // fill in callback array
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP1_IN_callback;
- epCallback[2] = &USBHAL::EP2_OUT_callback;
- epCallback[3] = &USBHAL::EP2_IN_callback;
- epCallback[4] = &USBHAL::EP3_OUT_callback;
- epCallback[5] = &USBHAL::EP3_IN_callback;
- epCallback[6] = &USBHAL::EP4_OUT_callback;
- epCallback[7] = &USBHAL::EP4_IN_callback;
- epCallback[8] = &USBHAL::EP5_OUT_callback;
- epCallback[9] = &USBHAL::EP5_IN_callback;
- epCallback[10] = &USBHAL::EP6_OUT_callback;
- epCallback[11] = &USBHAL::EP6_IN_callback;
- epCallback[12] = &USBHAL::EP7_OUT_callback;
- epCallback[13] = &USBHAL::EP7_IN_callback;
- epCallback[14] = &USBHAL::EP8_OUT_callback;
- epCallback[15] = &USBHAL::EP8_IN_callback;
- epCallback[16] = &USBHAL::EP9_OUT_callback;
- epCallback[17] = &USBHAL::EP9_IN_callback;
- epCallback[18] = &USBHAL::EP10_OUT_callback;
- epCallback[19] = &USBHAL::EP10_IN_callback;
- epCallback[20] = &USBHAL::EP11_OUT_callback;
- epCallback[21] = &USBHAL::EP11_IN_callback;
- epCallback[22] = &USBHAL::EP12_OUT_callback;
- epCallback[23] = &USBHAL::EP12_IN_callback;
- epCallback[24] = &USBHAL::EP13_OUT_callback;
- epCallback[25] = &USBHAL::EP13_IN_callback;
- epCallback[26] = &USBHAL::EP14_OUT_callback;
- epCallback[27] = &USBHAL::EP14_IN_callback;
- epCallback[28] = &USBHAL::EP15_OUT_callback;
- epCallback[29] = &USBHAL::EP15_IN_callback;
-
- // Enable power to USB device controller
- LPC_SC->PCONP |= PCUSB;
-
- // Enable USB clocks
- LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN;
- while ((LPC_USB->USBClkSt & (DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN)) != (DEV_CLK_ON | AHB_CLK_ON | PORT_CLK_EN));
-
- // Select port USB2
- LPC_USB->StCtrl |= 3;
-
-
- // Configure pin P0.31 to be USB2
- LPC_IOCON->P0_31 &= ~0x07;
- LPC_IOCON->P0_31 |= 0x01;
-
- // Disconnect USB device
- SIEdisconnect();
-
- // Configure pin P0.14 to be Connect
- LPC_IOCON->P0_14 &= ~0x07;
- LPC_IOCON->P0_14 |= 0x03;
-
- // Connect must be low for at least 2.5uS
- wait(0.3);
-
- // Set the maximum packet size for the control endpoints
- realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
- realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
-
- // Attach IRQ
- instance = this;
- NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);
-
- // Enable interrupts for device events and EP0
- LPC_USB->DevIntEn = EP_SLOW | DEV_STAT | FRAME;
- enableEndpointEvent(EP0IN);
- enableEndpointEvent(EP0OUT);
-}
-
-USBHAL::~USBHAL(void) {
- // Ensure device disconnected
- SIEdisconnect();
- // Disable USB interrupts
- NVIC_DisableIRQ(USB_IRQn);
-}
-
-void USBHAL::connect(void) {
- NVIC_EnableIRQ(USB_IRQn);
- // Connect USB device
- SIEconnect();
-}
-
-void USBHAL::disconnect(void) {
- NVIC_DisableIRQ(USB_IRQn);
- // Disconnect USB device
- SIEdisconnect();
-}
-
-void USBHAL::configureDevice(void) {
- SIEconfigureDevice();
-}
-
-void USBHAL::unconfigureDevice(void) {
- SIEunconfigureDevice();
-}
-
-void USBHAL::setAddress(uint8_t address) {
- SIEsetAddress(address);
-}
-
-void USBHAL::EP0setup(uint8_t *buffer) {
- endpointReadcore(EP0OUT, buffer);
-}
-
-void USBHAL::EP0read(void) {
- // Not required
-}
-
-void USBHAL::EP0readStage(void) {
- // Not required
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
- return endpointReadcore(EP0OUT, buffer);
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
- endpointWritecore(EP0IN, buffer, size);
-}
-
-void USBHAL::EP0getWriteResult(void) {
- // Not required
-}
-
-void USBHAL::EP0stall(void) {
- // This will stall both control endpoints
- stallEndpoint(EP0OUT);
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
-
- //for isochronous endpoint, we don't wait an interrupt
- if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {
- if (!(epComplete & EP(endpoint)))
- return EP_PENDING;
- }
-
- *bytesRead = endpointReadcore(endpoint, buffer);
- epComplete &= ~EP(endpoint);
- return EP_COMPLETED;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
- if (getEndpointStallState(endpoint)) {
- return EP_STALLED;
- }
-
- epComplete &= ~EP(endpoint);
-
- endpointWritecore(endpoint, data, size);
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
- if (epComplete & EP(endpoint)) {
- epComplete &= ~EP(endpoint);
- return EP_COMPLETED;
- }
-
- return EP_PENDING;
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {
- // Realise an endpoint
- LPC_USB->DevIntClr = EP_RLZED;
- LPC_USB->ReEp |= EP(endpoint);
- LPC_USB->EpInd = endpoint;
- LPC_USB->MaxPSize = maxPacket;
-
- while (!(LPC_USB->DevIntSt & EP_RLZED));
- LPC_USB->DevIntClr = EP_RLZED;
-
- // Clear stall state
- endpointStallState &= ~EP(endpoint);
-
- enableEndpointEvent(endpoint);
- return true;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint) {
- // Stall an endpoint
- if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) {
- // Conditionally stall both control endpoints
- SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST);
- } else {
- SIEsetEndpointStatus(endpoint, SIE_SES_ST);
-
- // Update stall state
- endpointStallState |= EP(endpoint);
- }
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint) {
- // Unstall an endpoint. The endpoint will also be reinitialised
- SIEsetEndpointStatus(endpoint, 0);
-
- // Update stall state
- endpointStallState &= ~EP(endpoint);
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint) {
- // Returns true if endpoint stalled
- return endpointStallState & EP(endpoint);
-}
-
-void USBHAL::remoteWakeup(void) {
- // Remote wakeup
- uint8_t status;
-
- // Enable USB clocks
- LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;
- while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));
-
- status = SIEgetDeviceStatus();
- SIEsetDeviceStatus(status & ~SIE_DS_SUS);
-}
-
-void USBHAL::_usbisr(void) {
- instance->usbisr();
-}
-
-
-void USBHAL::usbisr(void) {
- uint8_t devStat;
-
- if (LPC_USB->DevIntSt & FRAME) {
- // Start of frame event
- SOF(SIEgetFrameNumber());
- // Clear interrupt status flag
- LPC_USB->DevIntClr = FRAME;
- }
-
- if (LPC_USB->DevIntSt & DEV_STAT) {
- // Device Status interrupt
- // Must clear the interrupt status flag before reading the device status from the SIE
- LPC_USB->DevIntClr = DEV_STAT;
-
- // Read device status from SIE
- devStat = SIEgetDeviceStatus();
- //printf("devStat: %d\r\n", devStat);
-
- if (devStat & SIE_DS_SUS_CH) {
- // Suspend status changed
- if((devStat & SIE_DS_SUS) != 0) {
- suspendStateChanged(0);
- }
- }
-
- if (devStat & SIE_DS_RST) {
- // Bus reset
- if((devStat & SIE_DS_SUS) == 0) {
- suspendStateChanged(1);
- }
- busReset();
- }
- }
-
- if (LPC_USB->DevIntSt & EP_SLOW) {
- // (Slow) Endpoint Interrupt
-
- // Process each endpoint interrupt
- if (LPC_USB->EpIntSt & EP(EP0OUT)) {
- if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) {
- // this is a setup packet
- EP0setupCallback();
- } else {
- EP0out();
- }
- LPC_USB->DevIntClr = EP_SLOW;
- }
-
- if (LPC_USB->EpIntSt & EP(EP0IN)) {
- selectEndpointClearInterrupt(EP0IN);
- LPC_USB->DevIntClr = EP_SLOW;
- EP0in();
- }
-
- for (uint8_t num = 2; num < 16*2; num++) {
- if (LPC_USB->EpIntSt & EP(num)) {
- selectEndpointClearInterrupt(num);
- epComplete |= EP(num);
- LPC_USB->DevIntClr = EP_SLOW;
- if ((instance->*(epCallback[num - 2]))()) {
- epComplete &= ~EP(num);
- }
- }
- }
- }
-}
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBHAL_Maxim.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,492 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
- * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of Maxim Integrated
- * Products, Inc. shall not be used except as stated in the Maxim Integrated
- * Products, Inc. Branding Policy.
- *
- * The mere transfer of this software does not imply any licenses
- * of trade secrets, proprietary technology, copyrights, patents,
- * trademarks, maskwork rights, or any other form of intellectual
- * property whatsoever. Maxim Integrated Products, Inc. retains all
- * ownership rights.
- *******************************************************************************
- */
-
-#if defined(TARGET_Maxim)
-
-#include "USBHAL.h"
-#include "usb_regs.h"
-#include "clkman_regs.h"
-
-#if defined(TARGET_MAX32625) || defined(TARGET_MAX32630)
-#include "pwrman_regs.h"
-#endif
-
-#define CONNECT_INTS (MXC_F_USB_DEV_INTEN_BRST | MXC_F_USB_DEV_INTEN_SETUP | MXC_F_USB_DEV_INTEN_EP_IN | MXC_F_USB_DEV_INTEN_EP_OUT | MXC_F_USB_DEV_INTEN_DMA_ERR)
-
-USBHAL *USBHAL::instance;
-
-typedef struct {
- volatile uint32_t buf0_desc;
- volatile uint32_t buf0_address;
- volatile uint32_t buf1_desc;
- volatile uint32_t buf1_address;
-} ep_buffer_t;
-
-typedef struct {
- ep_buffer_t out_buffer;
- ep_buffer_t in_buffer;
-} ep0_buffer_t;
-
-typedef struct {
- ep0_buffer_t ep0;
- ep_buffer_t ep[MXC_USB_NUM_EP - 1];
-} ep_buffer_descriptor_t;
-
-// Static storage for endpoint buffer descriptor table. Must be 512 byte aligned for DMA.
-#ifdef __IAR_SYSTEMS_ICC__
-#pragma data_alignment = 512
-#else
-__attribute__ ((aligned (512)))
-#endif
-ep_buffer_descriptor_t ep_buffer_descriptor;
-
-// static storage for temporary data buffers. Must be 32 byte aligned.
-#ifdef __IAR_SYSTEMS_ICC__
-#pragma data_alignment = 4
-#else
-__attribute__ ((aligned (4)))
-#endif
-static uint8_t aligned_buffer[NUMBER_OF_LOGICAL_ENDPOINTS][MXC_USB_MAX_PACKET];
-
-// control packet state
-static enum {
- CTRL_NONE = 0,
- CTRL_SETUP,
- CTRL_OUT,
- CTRL_IN,
-} control_state;
-
-USBHAL::USBHAL(void)
-{
- NVIC_DisableIRQ(USB_IRQn);
-
-#if defined(TARGET_MAX32600)
- // The PLL must be enabled for USB
- MBED_ASSERT(MXC_CLKMAN->clk_config & MXC_F_CLKMAN_CLK_CONFIG_PLL_ENABLE);
-
- // Enable the USB clock
- MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_USB_GATE_N;
-#elif defined(TARGET_MAX32620)
- // Enable the USB clock
- MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_USB_CLOCK_ENABLE;
-#elif defined(TARGET_MAX32625) || defined(TARGET_MAX32630)
- MXC_PWRMAN->pwr_rst_ctrl |= MXC_F_PWRMAN_PWR_RST_CTRL_USB_POWERED;
- MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_USB_CLOCK_ENABLE;
-#endif
-
- // reset the device
- MXC_USB->cn = 0;
- MXC_USB->cn = MXC_F_USB_CN_USB_EN;
- MXC_USB->dev_inten = 0;
- MXC_USB->dev_cn = 0;
- MXC_USB->dev_cn = MXC_F_USB_DEV_CN_URST;
- MXC_USB->dev_cn = 0;
-
- // fill in callback arrays
- epCallback[EP0OUT] = NULL;
- epCallback[EP0IN] = NULL;
- epCallback[EP1OUT] = &USBHAL::EP1_OUT_callback;
- epCallback[EP1IN ] = &USBHAL::EP1_IN_callback;
- epCallback[EP2OUT] = &USBHAL::EP2_OUT_callback;
- epCallback[EP2IN ] = &USBHAL::EP2_IN_callback;
- epCallback[EP3OUT] = &USBHAL::EP3_OUT_callback;
- epCallback[EP3IN ] = &USBHAL::EP3_IN_callback;
- epCallback[EP4OUT] = &USBHAL::EP4_OUT_callback;
- epCallback[EP4IN ] = &USBHAL::EP4_IN_callback;
- epCallback[EP5OUT] = &USBHAL::EP5_OUT_callback;
- epCallback[EP5IN ] = &USBHAL::EP5_IN_callback;
- epCallback[EP6OUT] = &USBHAL::EP6_OUT_callback;
- epCallback[EP6IN ] = &USBHAL::EP6_IN_callback;
- epCallback[EP7OUT] = &USBHAL::EP7_OUT_callback;
- epCallback[EP7IN ] = &USBHAL::EP7_IN_callback;
-
- // clear driver state
- control_state = CTRL_NONE;
-
- // set the descriptor location
- MXC_USB->ep_base = (uint32_t)&ep_buffer_descriptor;
-
- // enable VBUS interrupts
- MXC_USB->dev_inten = MXC_F_USB_DEV_INTEN_NO_VBUS | MXC_F_USB_DEV_INTEN_VBUS;
-
- // attach IRQ handler and enable interrupts
- instance = this;
- NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);
- NVIC_EnableIRQ(USB_IRQn);
-}
-
-USBHAL::~USBHAL(void)
-{
- MXC_USB->dev_cn = MXC_F_USB_DEV_CN_URST;
- MXC_USB->dev_cn = 0;
- MXC_USB->cn = 0;
-}
-
-void USBHAL::connect(void)
-{
- // enable interrupts
- MXC_USB->dev_inten |= CONNECT_INTS;
-
- // allow interrupts on ep0
- MXC_USB->ep[0] |= MXC_F_USB_EP_INT_EN;
-
- // pullup enable
- MXC_USB->dev_cn |= (MXC_F_USB_DEV_CN_CONNECT | MXC_F_USB_DEV_CN_FIFO_MODE);
-}
-
-void USBHAL::disconnect(void)
-{
- // disable interrupts
- MXC_USB->dev_inten &= ~CONNECT_INTS;
-
- // disable pullup
- MXC_USB->dev_cn &= ~MXC_F_USB_DEV_CN_CONNECT;
-}
-
-void USBHAL::configureDevice(void)
-{
- // do nothing
-}
-
-void USBHAL::unconfigureDevice(void)
-{
- // reset endpoints
- for (int i = 0; i < MXC_USB_NUM_EP; i++) {
- // Disable endpoint and clear the data toggle
- MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR;
- MXC_USB->ep[i] |= MXC_F_USB_EP_DT;
- }
-}
-
-void USBHAL::setAddress(uint8_t address)
-{
- // do nothing
-}
-
-void USBHAL::remoteWakeup(void)
-{
- // do nothing
-}
-
-static ep_buffer_t *get_desc(uint8_t endpoint)
-{
- uint8_t epnum = EP_NUM(endpoint);
- ep_buffer_t *desc;
-
- if (epnum == 0) {
- if (IN_EP(endpoint)) {
- desc = &ep_buffer_descriptor.ep0.in_buffer;
- } else {
- desc = &ep_buffer_descriptor.ep0.out_buffer;
- }
- } else {
- desc = &ep_buffer_descriptor.ep[epnum - 1];
- }
-
- return desc;
-}
-
-void USBHAL::EP0setup(uint8_t *buffer)
-{
- // Setup packet is fixed at 8 bytes
- // Setup registers cannot be read in byte mode
- uint32_t *ptr32 = (uint32_t*)buffer;
- ptr32[0] = (uint32_t)MXC_USB->setup0;
- ptr32[1] = (uint32_t)MXC_USB->setup1;
-}
-
-void USBHAL::EP0read(void)
-{
- if (control_state == CTRL_IN) {
- // This is the status stage. ACK.
- MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK;
- control_state = CTRL_NONE;
- return;
- }
-
- control_state = CTRL_OUT;
-
- endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0);
-}
-
-void USBHAL::EP0readStage(void)
-{
- // do nothing
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
-{
- uint32_t size;
-
- if (MXC_USB->out_owner & 1) {
- return 0;
- }
-
- // get the packet length and contents
- ep_buffer_t *desc = get_desc(EP0OUT);
- size = desc->buf0_desc;
- memcpy(buffer, aligned_buffer[0], size);
-
- return size;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
-{
- if ((size == 0) && (control_state != CTRL_IN)) {
- // This is a status stage ACK. Handle in hardware.
- MXC_USB->ep[0] |= MXC_F_USB_EP_ST_ACK;
- control_state = CTRL_NONE;
- return;
- }
-
- control_state = CTRL_IN;
-
- endpointWrite(EP0IN, buffer, size);
-}
-
-void USBHAL::EP0stall(void)
-{
- stallEndpoint(0);
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize)
-{
- uint8_t epnum = EP_NUM(endpoint);
-
- if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) {
- return EP_INVALID;
- }
-
- if (maximumSize > MXC_USB_MAX_PACKET) {
- return EP_INVALID;
- }
-
- uint32_t mask = (1 << epnum);
- if (MXC_USB->out_owner & mask) {
- return EP_INVALID;
- }
-
- ep_buffer_t *desc = get_desc(endpoint);
- desc->buf0_desc = maximumSize;
- desc->buf0_address = (uint32_t)aligned_buffer[epnum];
-
- MXC_USB->out_owner = mask;
-
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead)
-{
- if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || IN_EP(endpoint)) {
- return EP_INVALID;
- }
-
- uint32_t mask = (1 << EP_NUM(endpoint));
- if (MXC_USB->out_owner & mask) {
- return EP_PENDING;
- }
-
- // get the packet length and contents
- ep_buffer_t *desc = get_desc(endpoint);
- *bytesRead = desc->buf0_desc;
- memcpy(data, aligned_buffer[EP_NUM(endpoint)], *bytesRead);
-
- return EP_COMPLETED;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
-{
- uint8_t epnum = EP_NUM(endpoint);
-
- if ((endpoint >= NUMBER_OF_PHYSICAL_ENDPOINTS) || OUT_EP(endpoint)) {
- return EP_INVALID;
- }
-
- if (size > MXC_USB_MAX_PACKET) {
- return EP_INVALID;
- }
-
- uint32_t mask = (1 << epnum);
- if (MXC_USB->in_owner & mask) {
- return EP_INVALID;
- }
-
- memcpy(aligned_buffer[epnum], data, size);
-
- ep_buffer_t *desc = get_desc(endpoint);
- desc->buf0_desc = size;
- desc->buf0_address = (uint32_t)aligned_buffer[epnum];
-
- // start the DMA
- MXC_USB->in_owner = mask;
-
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
-{
- uint32_t mask = (1 << EP_NUM(endpoint));
- if (MXC_USB->in_owner & mask) {
- return EP_PENDING;
- }
-
- return EP_COMPLETED;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint)
-{
- uint8_t epnum = EP_NUM(endpoint);
-
- if (epnum == 0) {
- MXC_USB->ep[epnum] |= MXC_F_USB_EP_ST_STALL;
- }
-
- MXC_USB->ep[epnum] |= MXC_F_USB_EP_STALL;
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint)
-{
- MXC_USB->ep[EP_NUM(endpoint)] &= ~MXC_F_USB_EP_STALL;
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options)
-{
- uint8_t epnum = EP_NUM(endpoint);
- uint32_t ep_ctrl;
-
- if (epnum >= NUMBER_OF_PHYSICAL_ENDPOINTS) {
- return false;
- }
-
- if (IN_EP(endpoint)) {
- ep_ctrl = (MXC_V_USB_EP_DIR_IN << MXC_F_USB_EP_DIR_POS);
- } else {
- ep_ctrl = (MXC_S_USB_EP_DIR_OUT << MXC_F_USB_EP_DIR_POS);
- }
-
- ep_ctrl |= (MXC_F_USB_EP_DT | MXC_F_USB_EP_INT_EN);
-
- MXC_USB->ep[epnum] = ep_ctrl;
-
- return true;
-}
-
-bool USBHAL::getEndpointStallState(unsigned char endpoint)
-{
- return !!(MXC_USB->ep[endpoint] & MXC_F_USB_EP_STALL);
-}
-
-void USBHAL::_usbisr(void)
-{
- instance->usbisr();
-}
-
-void USBHAL::usbisr(void)
-{
- // get and clear irqs
- uint32_t irq_flags = MXC_USB->dev_intfl;
- MXC_USB->dev_intfl = irq_flags;
-
- // process only enabled interrupts
- irq_flags &= MXC_USB->dev_inten;
-
- // suspend
- if (irq_flags & MXC_F_USB_DEV_INTFL_SUSP) {
- suspendStateChanged(1);
- }
-
- // bus reset
- if (irq_flags & MXC_F_USB_DEV_INTFL_BRST) {
-
- // reset endpoints
- for (int i = 0; i < MXC_USB_NUM_EP; i++) {
- // Disable endpoint and clear the data toggle
- MXC_USB->ep[i] &= ~MXC_F_USB_EP_DIR;
- MXC_USB->ep[i] |= MXC_F_USB_EP_DT;
- }
-
- // clear driver state
- control_state = CTRL_NONE;
-
- busReset();
-
- // no need to process events after reset
- return;
- }
-
- // Setup packet
- if (irq_flags & MXC_F_USB_DEV_INTFL_SETUP) {
- control_state = CTRL_SETUP;
- EP0setupCallback();
- }
-
- // IN packets
- if (irq_flags & MXC_F_USB_DEV_INTFL_EP_IN) {
- // get and clear IN irqs
- uint32_t in_irqs = MXC_USB->in_int;
- MXC_USB->in_int = in_irqs;
-
- if (in_irqs & 1) {
- EP0in();
- }
-
- for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) {
- uint32_t irq_mask = (1 << epnum);
- if (in_irqs & irq_mask) {
- uint8_t endpoint = (epnum << 1) | DIR_IN;
- (instance->*(epCallback[endpoint]))();
- }
- }
- }
-
- // OUT packets
- if (irq_flags & MXC_F_USB_DEV_INTFL_EP_OUT) {
- // get and clear OUT irqs
- uint32_t out_irqs = MXC_USB->out_int;
- MXC_USB->out_int = out_irqs;
-
- if (out_irqs & 1) {
- EP0out();
- }
-
- for (uint8_t epnum = 1; epnum < NUMBER_OF_LOGICAL_ENDPOINTS; epnum++) {
- uint32_t irq_mask = (1 << epnum);
- if (out_irqs & irq_mask) {
- uint8_t endpoint = (epnum << 1) | DIR_OUT;
- (instance->*(epCallback[endpoint]))();
- }
- }
- }
-}
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBHAL_RZ_A1H.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1497 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or
-* sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the
-* Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#if defined(TARGET_RZ_A1H) || defined(TARGET_VK_RZ_A1H)
-
-/*
- This class can use the pipe1, pipe3 and pipe6 only. You should
- re-program this class if you wanted to use other pipe.
- */
-
-/*************************************************************************/
-extern "C"
-{
-#include "r_typedefs.h"
-#include "iodefine.h"
-}
-#include "USBHAL.h"
-#include "devdrv_usb_function_api.h"
-#include "usb_iobitmask.h"
-#include "rza_io_regrw.h"
-#include "USBDevice_Types.h"
-#include "usb_function_setting.h"
-
-
-/*************************************************************************/
-/* constants */
-const struct PIPECFGREC {
- uint16_t endpoint;
- uint16_t pipesel;
- uint16_t pipecfg;
- uint16_t pipebuf;
- uint16_t pipemaxp;
- uint16_t pipeperi;
-} def_pipecfg[] = {
- /*EP0OUT and EP0IN are configured by USB IP*/
- {
- EP1OUT, /*EP1: Host -> Func, INT*/
- 6 | USB_FUNCTION_D0FIFO_USE,
- USB_FUNCTION_INTERRUPT |
- USB_FUNCTION_BFREOFF |
- USB_FUNCTION_DBLBOFF |
- USB_FUNCTION_CNTMDON |
- USB_FUNCTION_SHTNAKOFF |
- USB_FUNCTION_DIR_P_OUT |
- USB_FUNCTION_EP1,
- ( ( ( 64) / 64 - 1 ) << 10 ) | 0x04u,
- MAX_PACKET_SIZE_EP1,
- DEVDRV_USBF_OFF |
- ( 3 << USB_PIPEPERI_IITV_SHIFT ),
- },
- {
- EP1IN, /*EP1: Host <- Func, INT*/
- 7 | USB_FUNCTION_D1FIFO_USE,
- USB_FUNCTION_INTERRUPT |
- USB_FUNCTION_BFREOFF |
- USB_FUNCTION_DBLBOFF |
- USB_FUNCTION_CNTMDOFF |
- USB_FUNCTION_SHTNAKOFF |
- USB_FUNCTION_DIR_P_IN |
- USB_FUNCTION_EP1,
- ( ( ( 64) / 64 - 1 ) << 10 ) | 0x05u,
- MAX_PACKET_SIZE_EP1,
- DEVDRV_USBF_OFF |
- ( 3 << USB_PIPEPERI_IITV_SHIFT ),
- },
- {
- EP2OUT, /*EP2: Host -> Func, BULK*/
- 3 | USB_FUNCTION_D0FIFO_USE,
- USB_FUNCTION_BULK |
- USB_FUNCTION_BFREOFF |
- USB_FUNCTION_DBLBON |
- USB_FUNCTION_CNTMDON |
- USB_FUNCTION_SHTNAKON |
- USB_FUNCTION_DIR_P_OUT |
- USB_FUNCTION_EP2,
- ( ( (2048) / 64 - 1 ) << 10 ) | 0x30u,
- MAX_PACKET_SIZE_EP2,
- DEVDRV_USBF_OFF |
- ( 0 << USB_PIPEPERI_IITV_SHIFT ),
- },
- {
- EP2IN, /*EP2: Host <- Func, BULK*/
- 4 | USB_FUNCTION_D1FIFO_USE,
- USB_FUNCTION_BULK |
- USB_FUNCTION_BFREOFF |
- USB_FUNCTION_DBLBOFF |
- USB_FUNCTION_CNTMDON |
- USB_FUNCTION_SHTNAKOFF |
- USB_FUNCTION_DIR_P_IN |
- USB_FUNCTION_EP2,
- ( ( (2048) / 64 - 1 ) << 10 ) | 0x50u,
- MAX_PACKET_SIZE_EP2,
- DEVDRV_USBF_OFF |
- ( 0 << USB_PIPEPERI_IITV_SHIFT ),
- },
- {
- EP3OUT, /*EP3: Host -> Func, ISO*/
- 1 | USB_FUNCTION_D0FIFO_USE,
- USB_FUNCTION_ISO |
- USB_FUNCTION_BFREOFF |
- USB_FUNCTION_DBLBON |
- USB_FUNCTION_CNTMDOFF |
- USB_FUNCTION_SHTNAKON |
- USB_FUNCTION_DIR_P_OUT |
- USB_FUNCTION_EP3,
- ( ( ( 512) / 64 - 1 ) << 10 ) | 0x10u,
- MAX_PACKET_SIZE_EP3,
- DEVDRV_USBF_OFF |
- ( 0 << USB_PIPEPERI_IITV_SHIFT ),
- },
- {
- EP3IN, /*EP3: Host <- Func, ISO*/
- 2 | USB_FUNCTION_D1FIFO_USE,
- USB_FUNCTION_ISO |
- USB_FUNCTION_BFREOFF |
- USB_FUNCTION_DBLBON |
- USB_FUNCTION_CNTMDOFF |
- USB_FUNCTION_SHTNAKOFF |
- USB_FUNCTION_DIR_P_IN |
- USB_FUNCTION_EP3,
- ( ( ( 512) / 64 - 1 ) << 10 ) | 0x20u,
- MAX_PACKET_SIZE_EP3,
- DEVDRV_USBF_OFF |
- ( 0 << USB_PIPEPERI_IITV_SHIFT ),
- },
- { /*terminator*/
- 0, 0, 0, 0, 0,
- },
-};
-
-
-/*************************************************************************/
-/* workareas */
-USBHAL * USBHAL::instance;
-
-static IRQn_Type int_id; /* interrupt ID */
-static uint16_t int_level; /* initerrupt level */
-static uint16_t clock_mode; /* input clock selector */
-static uint16_t mode; /* USB speed (HIGH/FULL) */
-
-//static DigitalOut *usbx_en;
-
-static uint16_t EP0_read_status;
-static uint16_t EPx_read_status;
-
-static uint16_t setup_buffer[MAX_PACKET_SIZE_EP0 / 2];
-
-/* 0: not used / other: a pipe number to use recv_buffer*/
-static uint8_t recv_buffer[MAX_PACKET_SIZE_EPBULK];
-volatile static uint16_t recv_error;
-
-
-/*************************************************************************/
-/* prototypes for C */
-extern "C" {
- void usbx_function_BRDYInterruptPIPE0 (uint16_t status, uint16_t intenb,
- USBHAL *object, void (USBHAL::*EP0func)(void));
-
- void usbx_function_BRDYInterrupt (uint16_t status, uint16_t intenb,
- USBHAL *object, bool (USBHAL::*epCallback[])(void));
-
- void usbx_function_NRDYInterruptPIPE0(uint16_t status, uint16_t intenb,
- USBHAL *object, void (USBHAL::*EP0func)(void));
-
- void usbx_function_NRDYInterrupt (uint16_t status, uint16_t intenb,
- USBHAL *object, bool (USBHAL::*epCallback[])(void));
-
- void usbx_function_BEMPInterruptPIPE0(uint16_t status, uint16_t intenb,
- USBHAL *object, void (USBHAL::*EP0func)(void));
-
- void usbx_function_BEMPInterrupt (uint16_t status, uint16_t intenb,
- USBHAL *object, bool (USBHAL::*epCallback[])(void));
-}
-
-
-/*************************************************************************/
-/* macros */
-
-/******************************************************************************
- * Function Name: usbx_function_BRDYInterruptPIPE0
- * Description : Executes BRDY interrupt for pipe0.
- * Arguments : uint16_t status ; BRDYSTS Register Value
- * : uint16_t intenb ; BRDYENB Register Value
- * Return Value : none
- *****************************************************************************/
-extern "C" {
- void usbx_function_BRDYInterruptPIPE0 (
- uint16_t status,
- uint16_t intenb,
- USBHAL *object,
- void (USBHAL::*EP0func)(void)
- )
- {
- volatile uint16_t dumy_sts;
- uint16_t read_status;
-
- USB20X.BRDYSTS =
- (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0];
- RZA_IO_RegWrite_16(
- &USB20X.CFIFOSEL, USB_FUNCTION_PIPE0,
- USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
-
- g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0] =
- g_usbx_function_data_count[USB_FUNCTION_PIPE0];
-
- read_status = usbx_function_read_buffer_c(USB_FUNCTION_PIPE0);
-
- g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0] -=
- g_usbx_function_data_count[USB_FUNCTION_PIPE0];
-
- switch (read_status) {
- case USB_FUNCTION_READING: /* Continue of data read */
- case USB_FUNCTION_READEND: /* End of data read */
- /* PID = BUF */
- usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);
-
- /*callback*/
- (object->*EP0func)();
- break;
-
- case USB_FUNCTION_READSHRT: /* End of data read */
- usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0);
- /* PID = BUF */
- usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);
-
- /*callback*/
- (object->*EP0func)();
- break;
-
- case USB_FUNCTION_READOVER: /* FIFO access error */
- /* Buffer Clear */
- USB20X.CFIFOCTR = USB_FUNCTION_BITBCLR;
- usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0);
- /* Req Error */
- usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
-
- /*callback*/
- (object->*EP0func)();
- break;
-
- case DEVDRV_USBF_FIFOERROR: /* FIFO access error */
- default:
- usbx_function_disable_brdy_int(USB_FUNCTION_PIPE0);
- /* Req Error */
- usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
- break;
- }
- /* Three dummy reads for clearing interrupt requests */
- dumy_sts = USB20X.BRDYSTS;
- }
-}
-
-
-/******************************************************************************
- * Function Name: usbx_function_BRDYInterrupt
- * Description : Executes BRDY interrupt uxclude pipe0.
- * Arguments : uint16_t status ; BRDYSTS Register Value
- * : uint16_t intenb ; BRDYENB Register Value
- * Return Value : none
- *****************************************************************************/
-extern "C" {
- void usbx_function_BRDYInterrupt(
- uint16_t status,
- uint16_t intenb,
- USBHAL *object,
- bool (USBHAL::*epCallback[])(void)
- )
- {
- volatile uint16_t dumy_sts;
-
- /**************************************************************
- * Function Name: usbx_function_brdy_int
- * Description : Executes BRDY interrupt(USB_FUNCTION_PIPE1-9).
- * : According to the pipe that interrupt is generated in,
- * : reads/writes buffer allocated in the pipe.
- * : This function is executed in the BRDY
- * : interrupt handler. This function
- * : clears BRDY interrupt status and BEMP
- * : interrupt status.
- * Arguments : uint16_t Status ; BRDYSTS Register Value
- * : uint16_t Int_enbl ; BRDYENB Register Value
- * Return Value : none
- *************************************************************/
- /* copied from usbx_function_intrn.c */
- uint32_t int_sense = 0;
- uint16_t pipe;
- uint16_t pipebit;
- uint16_t ep;
-
- for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) {
- pipebit = g_usbx_function_bit_set[pipe];
-
- if ((status & pipebit) && (intenb & pipebit)) {
- USB20X.BRDYSTS = (uint16_t)~pipebit;
- USB20X.BEMPSTS = (uint16_t)~pipebit;
-
- switch (g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) {
- case USB_FUNCTION_D0FIFO_DMA:
- if (g_usbx_function_DmaStatus[USB_FUNCTION_D0FIFO] != USB_FUNCTION_DMA_READY) {
- /*now, DMA is not supported*/
- usbx_function_dma_interrupt_d0fifo(int_sense);
- }
-
- if (RZA_IO_RegRead_16(
- &g_usbx_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) {
- /*now, DMA is not supported*/
- usbx_function_read_dma(pipe);
- usbx_function_disable_brdy_int(pipe);
- } else {
- USB20X.D0FIFOCTR = USB_FUNCTION_BITBCLR;
- g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
- }
- break;
-
- case USB_FUNCTION_D1FIFO_DMA:
- if (g_usbx_function_DmaStatus[USB_FUNCTION_D1FIFO] != USB_FUNCTION_DMA_READY) {
- /*now, DMA is not supported*/
- usbx_function_dma_interrupt_d1fifo(int_sense);
- }
-
- if (RZA_IO_RegRead_16(
- &g_usbx_function_pipecfg[pipe], USB_PIPECFG_BFRE_SHIFT, USB_PIPECFG_BFRE) == 0) {
- /*now, DMA is not supported*/
- usbx_function_read_dma(pipe);
- usbx_function_disable_brdy_int(pipe);
- } else {
- USB20X.D1FIFOCTR = USB_FUNCTION_BITBCLR;
- g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
- }
- break;
-
- default:
- ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
- ep <<= 1;
- if (RZA_IO_RegRead_16(
- &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
- /* read */
- EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
- (object->*(epCallback[ep - 2])) ();
- EPx_read_status = DEVDRV_USBF_PIPE_DONE;
- } else {
- /* write */
- EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
- (object->*(epCallback[ep - 2 + 1])) ();
- EPx_read_status = DEVDRV_USBF_PIPE_DONE;
- usbx_function_write_buffer(pipe);
- }
- }
- }
- }
- /* Three dummy reads for clearing interrupt requests */
- dumy_sts = USB20X.BRDYSTS;
- }
-}
-
-
-/******************************************************************************
- * Function Name: usbx_function_NRDYInterruptPIPE0
- * Description : Executes NRDY interrupt for pipe0.
- * Arguments : uint16_t status ; NRDYSTS Register Value
- * : uint16_t intenb ; NRDYENB Register Value
- * Return Value : none
- *****************************************************************************/
-extern "C" {
- void usbx_function_NRDYInterruptPIPE0(
- uint16_t status,
- uint16_t intenb,
- USBHAL *object,
- void (USBHAL::*EP0func)(void)
- )
- {
- volatile uint16_t dumy_sts;
-
- USB20X.NRDYSTS =
- (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0];
-
- /* Three dummy reads for clearing interrupt requests */
- dumy_sts = USB20X.NRDYSTS;
- }
-}
-
-
-/******************************************************************************
- * Function Name: usbx_function_NRDYInterrupt
- * Description : Executes NRDY interrupt exclude pipe0.
- * Arguments : uint16_t status ; NRDYSTS Register Value
- * : uint16_t intenb ; NRDYENB Register Value
- * Return Value : none
- *****************************************************************************/
-extern "C" {
- void usbx_function_NRDYInterrupt(
- uint16_t status,
- uint16_t intenb,
- USBHAL *object,
- bool (USBHAL::*epCallback[])(void)
- )
- {
- volatile uint16_t dumy_sts;
-
- /**************************************************************
- * Function Name: usbx_function_nrdy_int
- * Description : Executes NRDY interrupt(USB_FUNCTION_PIPE1-9).
- * : Checks NRDY interrupt cause by PID. When the cause if STALL,
- * : regards the pipe state as STALL and ends the processing.
- * : Then the cause is not STALL, increments the error count to
- * : communicate again. When the error count is 3, determines
- * : the pipe state as DEVDRV_USBF_PIPE_NORES and ends the processing.
- * : This function is executed in the NRDY interrupt handler.
- * : This function clears NRDY interrupt status.
- * Arguments : uint16_t status ; NRDYSTS Register Value
- * : uint16_t int_enb ; NRDYENB Register Value
- * Return Value : none
- *************************************************************/
- /* copied from usbx_function_intrn.c */
-#if 0
- uint16_t usefifo;
-#endif
- uint16_t pid;
- uint16_t pipe;
- uint16_t bitcheck;
-#if 0
- uint16_t mbw;
- uint32_t size;
-#endif
- uint16_t ep;
-
- bitcheck = (uint16_t)(status & intenb);
-
- USB20X.NRDYSTS = (uint16_t)~status;
-
-
- if (RZA_IO_RegRead_16(&USB20X.SYSCFG0, USB_SYSCFG_DCFM_SHIFT, USB_SYSCFG_DCFM) == 1) {
- /* USB HOST */
- /* not support */
-
- } else {
- /* USB Function */
- for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) {
- if ((bitcheck&g_usbx_function_bit_set[pipe]) != g_usbx_function_bit_set[pipe]) {
- continue;
- }
-
- if (g_usbx_function_pipe_status[pipe] != DEVDRV_USBF_PIPE_WAIT) {
- continue;
- }
-
-#if 0
- usbx_function_set_pid_nak(pipe);
-
- size = (uint32_t)g_usbx_function_data_count[pipe];
- mbw = usbx_function_get_mbw(
- size, (uint32_t)g_usbx_function_data_pointer[pipe]);
-
- usefifo = (uint16_t)(g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE);
- switch (usefifo) {
-
- case USB_FUNCTION_D0FIFO_USE:
- usbx_function_set_curpipe(
- pipe, USB_FUNCTION_D0USE, DEVDRV_USBF_NO, mbw);
- USB20X.D0FIFOCTR = USB_FUNCTION_BITBCLR;
- break;
-
- case USB_FUNCTION_D1FIFO_USE:
- usbx_function_set_curpipe(
- pipe, USB_FUNCTION_D1USE, DEVDRV_USBF_NO, mbw);
- USB20X.D1FIFOCTR = USB_FUNCTION_BITBCLR;
- break;
-
- default:
- usbx_function_set_curpipe(
- pipe, USB_FUNCTION_CUSE, USB_FUNCTION_CFIFO_READ, mbw);
- USB20X.CFIFOCTR = USB_FUNCTION_BITBCLR;
- break;
- }
-
- usbx_function_aclrm(pipe);
-
- usbx_function_enable_nrdy_int(pipe);
- usbx_function_enable_brdy_int(pipe);
-
- usbx_function_set_pid_buf(pipe);
-#endif
-
- pid = usbx_function_get_pid(pipe);
- if ((pid == DEVDRV_USBF_PID_STALL) || (pid == DEVDRV_USBF_PID_STALL2)) {
- g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
- } else {
- usbx_function_set_pid_buf(pipe);
- }
-
- ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
- ep <<= 1;
- if (RZA_IO_RegRead_16(
- &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
- /* read */
- __NOP();
- } else {
- /* write */
- __NOP();
- }
- }
- }
-
- /* Three dummy reads for clearing interrupt requests */
- dumy_sts = USB20X.NRDYSTS;
- }
-}
-
-/******************************************************************************
- * Function Name: usbx_function_BEMPInterruptPIPE0
- * Description : Executes BEMP interrupt for pipe0.
- * Arguments : uint16_t status ; BEMPSTS Register Value
- * : uint16_t intenb ; BEMPENB Register Value
- * Return Value : none
- *****************************************************************************/
-extern "C" {
- void usbx_function_BEMPInterruptPIPE0(
- uint16_t status,
- uint16_t intenb,
- USBHAL *object,
- void (USBHAL::*EP0func)(void)
- )
- {
- volatile uint16_t dumy_sts;
-
- USB20X.BEMPSTS =
- (uint16_t)~g_usbx_function_bit_set[USB_FUNCTION_PIPE0];
- RZA_IO_RegWrite_16(
- &USB20X.CFIFOSEL, USB_FUNCTION_PIPE0,
- USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
-
- /*usbx_function_write_buffer_c(USB_FUNCTION_PIPE0);*/
- (object->*EP0func)();
-
- /* Three dummy reads for clearing interrupt requests */
- dumy_sts = USB20X.BEMPSTS;
- }
-}
-
-
-/******************************************************************************
- * Function Name: usbx_function_BEMPInterrupt
- * Description : Executes BEMP interrupt exclude pipe0.
- * Arguments : uint16_t status ; BEMPSTS Register Value
- * : uint16_t intenb ; BEMPENB Register Value
- * Return Value : none
- *****************************************************************************/
-extern "C" {
- void usbx_function_BEMPInterrupt(
- uint16_t status,
- uint16_t intenb,
- USBHAL *object,
- bool (USBHAL::*epCallback[])(void)
- )
- {
- volatile uint16_t dumy_sts;
-
- /**************************************************************
- * Function Name: usbx_function_bemp_int
- * Description : Executes BEMP interrupt(USB_FUNCTION_PIPE1-9).
- * Arguments : uint16_t status ; BEMPSTS Register Value
- * : uint16_t intenb ; BEMPENB Register Value
- * Return Value : none
- *************************************************************/
- /* copied from usbx_function_intrn.c */
- uint16_t pid;
- uint16_t pipe;
- uint16_t bitcheck;
- uint16_t inbuf;
- uint16_t ep;
-
- bitcheck = (uint16_t)(status & intenb);
-
- USB20X.BEMPSTS = (uint16_t)~status;
-
- for (pipe = USB_FUNCTION_PIPE1; pipe <= USB_FUNCTION_MAX_PIPE_NO; pipe++) {
- if ((bitcheck&g_usbx_function_bit_set[pipe]) != g_usbx_function_bit_set[pipe]) {
- continue;
- }
-
- pid = usbx_function_get_pid(pipe);
-
- if ((pid == DEVDRV_USBF_PID_STALL) ||
- (pid == DEVDRV_USBF_PID_STALL2)) {
- g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_STALL;
-
- } else {
- inbuf = usbx_function_get_inbuf(pipe);
-
- if (inbuf == 0) {
- usbx_function_disable_bemp_int(pipe);
- usbx_function_set_pid_nak(pipe);
- g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_DONE;
-
- switch (g_usbx_function_PipeTbl[pipe] & USB_FUNCTION_FIFO_USE) {
- case USB_FUNCTION_D0FIFO_DMA:
- /*now, DMA is not supported*/
- break;
-
- case USB_FUNCTION_D1FIFO_DMA:
- /*now, DMA is not supported*/
- break;
-
- default:
- ep = (g_usbx_function_pipecfg[pipe] & USB_PIPECFG_EPNUM) >> USB_PIPECFG_EPNUM_SHIFT;
- ep <<= 1;
- if (RZA_IO_RegRead_16(
- &g_usbx_function_pipecfg[pipe], USB_PIPECFG_DIR_SHIFT, USB_PIPECFG_DIR) == 0) {
- /* read */
- __NOP();
- } else {
- /* write */
- EPx_read_status = DEVDRV_USBF_PIPE_WAIT;
- (object->*(epCallback[ep - 2 + 1])) ();
- EPx_read_status = DEVDRV_USBF_PIPE_DONE;
- }
- }
- }
- }
- }
-
- /* Three dummy reads for clearing interrupt requests */
- dumy_sts = USB20X.BEMPSTS;
- }
-}
-
-/******************************************************************************
- * Function Name: EP2PIPE
- * Description : Converts from endpoint to pipe
- * Arguments : number of endpoint
- * Return Value : number of pipe
- *****************************************************************************/
-/*EP2PIPE converter is for pipe1, pipe3 and pipe6 only.*/
-#define EP2PIPE(endpoint) ((uint32_t)usbx_function_EpToPipe(endpoint))
-
-
-/******************************************************************************
- * Function Name: usbx_function_save_request
- * Description : Retains the USB request information in variables.
- * Arguments : none
- * Return Value : none
- *****************************************************************************/
-#define usbx_function_save_request() \
- { \
- uint16_t *bufO = &setup_buffer[0]; \
- \
- USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVALID; \
- /*data[0] <= bmRequest, data[1] <= bmRequestType */ \
- *bufO++ = USB20X.USBREQ; \
- /*data[2] data[3] <= wValue*/ \
- *bufO++ = USB20X.USBVAL; \
- /*data[4] data[5] <= wIndex*/ \
- *bufO++ = USB20X.USBINDX; \
- /*data[6] data[6] <= wIndex*/ \
- *bufO++ = USB20X.USBLENG; \
- }
-
-
-/*************************************************************************/
-/*************************************************************************/
-/*************************************************************************/
-
-/*************************************************************************/
-/* constructor */
-USBHAL::USBHAL(void)
-{
- /* ---- P4_1 : P4_1 (USB0_EN for GR-PEACH) ---- */
- //usbx_en = new DigitalOut(P4_1, 1);
-
- /* some constants */
- int_id = USBIX_IRQn;
- int_level = ( 2 << 3 );
- clock_mode = USBFCLOCK_X1_48MHZ;
-#if (USB_FUNCTION_HISPEED == 0)
- mode = USB_FUNCTION_FULL_SPEED;
-#else
- mode = USB_FUNCTION_HIGH_SPEED;
-#endif
- EP0_read_status = DEVDRV_USBF_WRITEEND;
- EPx_read_status = DEVDRV_USBF_PIPE_DONE;
-
- /* Disables interrupt for usb */
- GIC_DisableIRQ(int_id);
-
- /* Setup the end point */
- epCallback[ 0] = &USBHAL::EP1_OUT_callback;
- epCallback[ 1] = &USBHAL::EP1_IN_callback;
- epCallback[ 2] = &USBHAL::EP2_OUT_callback;
- epCallback[ 3] = &USBHAL::EP2_IN_callback;
- epCallback[ 4] = &USBHAL::EP3_OUT_callback;
- epCallback[ 5] = &USBHAL::EP3_IN_callback;
- epCallback[ 6] = &USBHAL::EP4_OUT_callback;
- epCallback[ 7] = &USBHAL::EP4_IN_callback;
- epCallback[ 8] = &USBHAL::EP5_OUT_callback;
- epCallback[ 9] = &USBHAL::EP5_IN_callback;
- epCallback[10] = &USBHAL::EP6_OUT_callback;
- epCallback[11] = &USBHAL::EP6_IN_callback;
- epCallback[12] = &USBHAL::EP7_OUT_callback;
- epCallback[13] = &USBHAL::EP7_IN_callback;
- epCallback[14] = &USBHAL::EP8_OUT_callback;
- epCallback[15] = &USBHAL::EP8_IN_callback;
- epCallback[16] = &USBHAL::EP9_OUT_callback;
- epCallback[17] = &USBHAL::EP9_IN_callback;
- epCallback[18] = &USBHAL::EP10_OUT_callback;
- epCallback[19] = &USBHAL::EP10_IN_callback;
- epCallback[20] = &USBHAL::EP11_OUT_callback;
- epCallback[21] = &USBHAL::EP11_IN_callback;
- epCallback[22] = &USBHAL::EP12_OUT_callback;
- epCallback[23] = &USBHAL::EP12_IN_callback;
- epCallback[24] = &USBHAL::EP13_OUT_callback;
- epCallback[25] = &USBHAL::EP13_IN_callback;
- epCallback[26] = &USBHAL::EP14_OUT_callback;
- epCallback[27] = &USBHAL::EP14_IN_callback;
- epCallback[28] = &USBHAL::EP15_OUT_callback;
- epCallback[29] = &USBHAL::EP15_IN_callback;
-
- /* registers me */
- instance = this;
-
- /* Clear pipe table */
- usbx_function_clear_pipe_tbl();
-
-/******************************************************************************
- * Function Name: usbx_api_function_init
- * Description : Initializes the USB module in the USB function mode.
- *****************************************************************************/
- /* The clock of USB0 modules is permitted */
-#if (USB_FUNCTION_CH == 0)
- CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71);
-#else
- CPG.STBCR7 &= ~(CPG_STBCR7_MSTP71 | CPG_STBCR7_MSTP70);
-#endif
- volatile uint8_t dummy8;
- dummy8 = CPG.STBCR7;
-
- {
-/******************************************************************************
- * Function Name: usbx_function_setting_interrupt
- * Description : Sets the USB module interrupt level.
- *****************************************************************************/
-#if 0 /*DMA is not supported*/
- IRQn_Type d0fifo_dmaintid;
- IRQn_Type d1fifo_dmaintid;
-#endif
-
- InterruptHandlerRegister(int_id, &_usbisr);
- GIC_SetPriority(int_id, int_level);
- GIC_EnableIRQ(int_id);
-
-#if 0 /*DMA is not supported*/
- d0fifo_dmaintid = Userdef_USB_usbx_function_d0fifo_dmaintid();
- if (d0fifo_dmaintid != 0xFFFF) {
- InterruptHandlerRegister(d0fifo_dmaintid, usbx_function_dma_interrupt_d0fifo);
- GIC_SetPriority(d0fifo_dmaintid, int_level);
- GIC_EnableIRQ(d0fifo_dmaintid);
- }
-#endif
-
-#if 0 /*DMA is not supported*/
- d1fifo_dmaintid = Userdef_USB_usbx_function_d1fifo_dmaintid();
- if (d1fifo_dmaintid != 0xFFFF) {
- InterruptHandlerRegister(d1fifo_dmaintid, usbx_function_dma_interrupt_d1fifo);
- GIC_SetPriority(d1fifo_dmaintid, int_level);
- GIC_EnableIRQ(d1fifo_dmaintid);
- }
-#endif
-/*****************************************************************************/
- }
-
- /* reset USB module with setting tranciever and HSE=1 */
- usbx_function_reset_module(clock_mode);
-
- /* clear variables */
- usbx_function_init_status();
-
- /* select USB Function and Interrupt Enable */
- /* Detect USB Device to attach or detach */
- usbx_function_InitModule(mode);
-
- {
- uint16_t buf;
- buf = USB20X.INTENB0;
- buf |= USB_INTENB0_SOFE;
- USB20X.INTENB0 = buf;
- }
-}
-
-/*************************************************************************/
-USBHAL::~USBHAL(void)
-{
- /* Disables interrupt for usb */
- GIC_DisableIRQ( int_id );
- /* Unregisters interrupt function and priority */
- InterruptHandlerRegister( int_id, (uint32_t)NULL );
-
- //usbx_en = NULL;
- instance = NULL;
-}
-
-/*************************************************************************/
-void USBHAL::connect(void)
-{
- /* Activates USB0_EN */
- //(*usbx_en) = 0;
-}
-
-
-/*************************************************************************/
-void USBHAL::disconnect(void)
-{
- /* Deactivates USB0_EN */
- //(*usbx_en) = 1;
-}
-
-
-/*************************************************************************/
-void USBHAL::configureDevice(void)
-{
- /*The pipes set up in USBHAL::realiseEndpoint*/
- /*usbx_function_clear_alt();*/ /* Alternate setting clear */
- /*usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);*/
-}
-
-
-/*************************************************************************/
-void USBHAL::unconfigureDevice(void)
-{
- /* The Interface would be managed by USBDevice */
- /*usbx_function_clear_alt();*/ /* Alternate setting clear */
- /*usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);*/
-}
-
-
-/*************************************************************************/
-void USBHAL::setAddress(uint8_t address)
-{
- if (address <= 127) {
- usbx_function_set_pid_buf(USB_FUNCTION_PIPE0); /* OK */
- } else {
- usbx_function_set_pid_stall(USB_FUNCTION_PIPE0); /* Not Spec */
- }
-}
-
-
-/*************************************************************************/
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags)
-{
- const struct PIPECFGREC *cfg;
- uint16_t pipe;
- uint16_t buf;
-
- if ( (EP0OUT == endpoint) || (EP0IN == endpoint) ) {
- return true;
- }
-
- for (cfg = &def_pipecfg[0]; cfg->pipesel != 0; cfg++) {
- if (cfg->endpoint == endpoint) {
- break;
- }
- }
- if (cfg->pipesel == 0) {
- return false;
- }
-
- pipe = ((cfg->pipesel & USB_PIPESEL_PIPESEL) >> USB_PIPESEL_PIPESEL_SHIFT);
-
- g_usbx_function_PipeTbl[ pipe ] = (uint16_t)(endpoint | ((cfg->pipesel & USB_FUNCTION_FIFO_USE) << 0));
-
- /* There are maintenance routine of SHTNAK and BFRE bits
- * in original sample program. This sample is not
- * programmed. Do maintenance the "def_pipecfg" array if
- * you want it. */
-
- /* Interrupt Disable */
- buf = USB20X.BRDYENB;
- buf &= (uint16_t)~g_usbx_function_bit_set[pipe];
- USB20X.BRDYENB = buf;
- buf = USB20X.NRDYENB;
- buf &= (uint16_t)~g_usbx_function_bit_set[pipe];
- USB20X.NRDYENB = buf;
- buf = USB20X.BEMPENB;
- buf &= (uint16_t)~g_usbx_function_bit_set[pipe];
- USB20X.BEMPENB = buf;
-
- usbx_function_set_pid_nak(pipe);
-
- /* CurrentPIPE Clear */
- if (RZA_IO_RegRead_16(&USB20X.CFIFOSEL, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE) == pipe) {
- RZA_IO_RegWrite_16(&USB20X.CFIFOSEL, 0, USB_CFIFOSEL_CURPIPE_SHIFT, USB_CFIFOSEL_CURPIPE);
- }
-
- if (RZA_IO_RegRead_16(&USB20X.D0FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) {
- RZA_IO_RegWrite_16(&USB20X.D0FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE);
- }
-
- if (RZA_IO_RegRead_16(&USB20X.D1FIFOSEL, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE) == pipe) {
- RZA_IO_RegWrite_16(&USB20X.D1FIFOSEL, 0, USB_DnFIFOSEL_CURPIPE_SHIFT, USB_DnFIFOSEL_CURPIPE);
- }
-
- /* PIPE Configuration */
- USB20X.PIPESEL = pipe;
- USB20X.PIPECFG = cfg->pipecfg;
- USB20X.PIPEBUF = cfg->pipebuf;
- USB20X.PIPEMAXP = cfg->pipemaxp;
- USB20X.PIPEPERI = cfg->pipeperi;
-
- g_usbx_function_pipecfg[pipe] = cfg->pipecfg;
- g_usbx_function_pipebuf[pipe] = cfg->pipebuf;
- g_usbx_function_pipemaxp[pipe] = cfg->pipemaxp;
- g_usbx_function_pipeperi[pipe] = cfg->pipeperi;
-
- /* Buffer Clear */
- usbx_function_set_sqclr(pipe);
- usbx_function_aclrm(pipe);
-
- /* init Global */
- g_usbx_function_pipe_status[pipe] = DEVDRV_USBF_PIPE_IDLE;
- g_usbx_function_PipeDataSize[pipe] = 0;
-
- return true;
-}
-
-
-/*************************************************************************/
-// read setup packet
-void USBHAL::EP0setup(uint8_t *buffer)
-{
- memcpy(buffer, setup_buffer, MAX_PACKET_SIZE_EP0);
-}
-
-
-/*************************************************************************/
-void USBHAL::EP0readStage(void)
-{
- // No implements
-}
-
-
-/*************************************************************************/
-void USBHAL::EP0read(void)
-{
- uint8_t *buffer;
- uint32_t size;
-
- /* remain of last writing */
- while (EP0_read_status != DEVDRV_USBF_WRITEEND) {
- static uint8_t bbb[2] = { 255, 255 };
- EP0write(&bbb[0], 0);
- }
-
- buffer = (uint8_t*)(&setup_buffer[4]);
- size = (MAX_PACKET_SIZE_EP0 / 2) - 8;
- usbx_api_function_CtrlWriteStart(size, buffer);
-}
-
-
-/*************************************************************************/
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer)
-{
- memcpy(buffer, (uint8_t*)(&setup_buffer[4]), g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0]);
-
- return g_usbx_function_PipeDataSize[USB_FUNCTION_PIPE0];
-}
-
-
-/*************************************************************************/
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size)
-{
- /* zero byte writing */
- if ( (size == 0) && (EP0_read_status == DEVDRV_USBF_WRITEEND) ) {
- return;
- }
-
- if (EP0_read_status == DEVDRV_USBF_WRITEEND) {
- /*1st block*/
- EP0_read_status = usbx_api_function_CtrlReadStart(size, buffer);
- } else {
- /* waits the last transmission */
- /*other blocks*/
- g_usbx_function_data_count[ USB_FUNCTION_PIPE0 ] = size;
- g_usbx_function_data_pointer [ USB_FUNCTION_PIPE0 ] = buffer;
- EP0_read_status = usbx_function_write_buffer_c(USB_FUNCTION_PIPE0);
- }
- /*max size may be deblocking outside*/
- if (size == MAX_PACKET_SIZE_EP0) {
- EP0_read_status = DEVDRV_USBF_WRITING;
- }
-}
-
-
-/*************************************************************************/
-#if 0 // No implements
-void USBHAL::EP0getWriteResult(void)
-{
-}
-#endif
-
-/*************************************************************************/
-void USBHAL::EP0stall(void)
-{
- stallEndpoint( 0 );
-}
-
-
-/*************************************************************************/
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t max_size)
-{
- uint32_t pipe = EP2PIPE(endpoint);
- uint32_t pipe_size;
- uint16_t pipe_status;
- EP_STATUS status = EP_COMPLETED;
-
- pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
-
- switch (pipe_status) {
- case DEVDRV_USBF_PIPE_IDLE:
- case DEVDRV_USBF_PIPE_WAIT:
- usbx_api_function_set_pid_nak(pipe);
- usbx_api_function_clear_pipe_status(pipe);
-
- usbx_api_function_start_receive_transfer(pipe, max_size, recv_buffer);
- break;
-
- default:
- status = EP_PENDING;
- break;
- }
-
- return status;
-}
-
-
-/*************************************************************************/
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *buffer, uint32_t *bytes_read )
-{
- uint32_t pipe = EP2PIPE(endpoint);
- uint16_t pipe_status;
- uint16_t err;
- EP_STATUS status = EP_PENDING;
-
-
- if (EPx_read_status != DEVDRV_USBF_PIPE_WAIT) {
- return status;
- }
-
- pipe_status = usbx_api_function_check_pipe_status(pipe, bytes_read);
- switch (pipe_status) {
- case DEVDRV_USBF_PIPE_IDLE:
- return EP_COMPLETED;
-
- case DEVDRV_USBF_PIPE_DONE:
- return EP_COMPLETED;
-
- case DEVDRV_USBF_PIPE_WAIT:
- break;
-
- default:
- return status;
- }
-
- /* sets the output buffer and size */
- g_usbx_function_data_pointer[pipe] = buffer;
-
- /* receives data from pipe */
- err = usbx_function_read_buffer(pipe);
- recv_error = err;
- switch (err) {
- case USB_FUNCTION_READEND:
- case USB_FUNCTION_READSHRT:
- case USB_FUNCTION_READOVER:
- *bytes_read = g_usbx_function_PipeDataSize[pipe];
- break;
-
- case USB_FUNCTION_READING:
- case DEVDRV_USBF_FIFOERROR:
- break;
- }
-
- pipe_status = usbx_api_function_check_pipe_status(pipe, bytes_read);
- switch (pipe_status) {
- case DEVDRV_USBF_PIPE_DONE:
- status = EP_COMPLETED;
- break;
-
- case DEVDRV_USBF_PIPE_IDLE:
- case DEVDRV_USBF_PIPE_NORES:
- case DEVDRV_USBF_PIPE_STALL:
- case DEVDRV_USBF_FIFOERROR:
- default:
- break;
- }
-
- return status;
-}
-
-
-/*************************************************************************/
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
-{
- uint32_t pipe = EP2PIPE(endpoint);
- uint32_t pipe_size;
- uint16_t pipe_status;
- uint16_t err;
- uint16_t count;
- EP_STATUS status = EP_PENDING;
-
- pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
-
- /* waits the last transmission */
- count = 30000;
- while ((pipe_status == DEVDRV_USBF_PIPE_WAIT) || (pipe_status == DEVDRV_USBF_PIPE_DONE)) {
- pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
- if( --count == 0 ) {
- pipe_status = DEVDRV_USBF_PIPE_STALL;
- break;
- }
- }
-
- switch (pipe_status) {
- case DEVDRV_USBF_PIPE_IDLE:
- err = usbx_api_function_start_send_transfer(pipe, size, data);
-
- switch (err) {
- /* finish to write */
- case DEVDRV_USBF_WRITEEND:
- /* finish to write, but data is short */
- case DEVDRV_USBF_WRITESHRT:
- /* continue to write */
- case DEVDRV_USBF_WRITING:
- /* use DMA */
- case DEVDRV_USBF_WRITEDMA:
- /* error */
- case DEVDRV_USBF_FIFOERROR:
- status = EP_PENDING;
- break;
- }
- break;
-
- case DEVDRV_USBF_PIPE_WAIT:
- case DEVDRV_USBF_PIPE_DONE:
- status = EP_PENDING;
- break;
-
- case DEVDRV_USBF_PIPE_NORES:
- case DEVDRV_USBF_PIPE_STALL:
- default:
- status = EP_STALLED;
- break;
- }
-
- return status;
-}
-
-
-/*************************************************************************/
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint)
-{
- uint32_t pipe = EP2PIPE(endpoint);
- uint32_t pipe_size;
- uint16_t pipe_status;
- EP_STATUS status = EP_PENDING;
-
- pipe_status = usbx_api_function_check_pipe_status(pipe, &pipe_size);
-
- switch (pipe_status) {
- case DEVDRV_USBF_PIPE_IDLE:
- status = EP_COMPLETED;
- break;
-
- case DEVDRV_USBF_PIPE_WAIT:
- status = EP_PENDING;
- break;
-
- case DEVDRV_USBF_PIPE_DONE:
- usbx_function_stop_transfer(pipe);
- status = EP_COMPLETED;
- break;
-
- case DEVDRV_USBF_PIPE_NORES:
- status = EP_STALLED;
- break;
-
- case DEVDRV_USBF_PIPE_STALL:
- status = EP_STALLED;
- break;
-
- default:
- status = EP_PENDING;
- }
-
- return status;
-}
-
-
-/*************************************************************************/
-void USBHAL::stallEndpoint(uint8_t endpoint)
-{
- uint32_t pipe = EP2PIPE(endpoint);
-
- usbx_function_clear_pid_stall(pipe);
-}
-
-
-/*************************************************************************/
-void USBHAL::unstallEndpoint(uint8_t endpoint)
-{
- uint32_t pipe = EP2PIPE(endpoint);
-
- usbx_function_set_pid_stall( pipe );
-}
-
-
-/*************************************************************************/
-bool USBHAL::getEndpointStallState(uint8_t endpoint)
-{
- // No implemens
- return false;
-}
-
-
-/*************************************************************************/
-#if 0 // No implements
-void USBHAL::remoteWakeup(void)
-{
-}
-#endif
-
-/*************************************************************************/
-void USBHAL::_usbisr(void)
-{
- instance->usbisr();
-}
-
-
-/*************************************************************************/
-void USBHAL::usbisr(void)
-{
- uint16_t int_sts0;
- uint16_t int_sts1;
- uint16_t int_sts2;
- uint16_t int_sts3;
- uint16_t int_enb0;
- uint16_t int_enb2;
- uint16_t int_enb3;
- uint16_t int_enb4;
- volatile uint16_t dumy_sts;
-
-
- int_sts0 = USB20X.INTSTS0;
-
- if (!(int_sts0 & (
- USB_FUNCTION_BITVBINT |
- USB_FUNCTION_BITRESM |
- USB_FUNCTION_BITSOFR |
- USB_FUNCTION_BITDVST |
- USB_FUNCTION_BITCTRT |
- USB_FUNCTION_BITBEMP |
- USB_FUNCTION_BITNRDY |
- USB_FUNCTION_BITBRDY ))) {
- return;
- }
-
- int_sts1 = USB20X.BRDYSTS;
- int_sts2 = USB20X.NRDYSTS;
- int_sts3 = USB20X.BEMPSTS;
- int_enb0 = USB20X.INTENB0;
- int_enb2 = USB20X.BRDYENB;
- int_enb3 = USB20X.NRDYENB;
- int_enb4 = USB20X.BEMPENB;
-
- if ((int_sts0 & USB_FUNCTION_BITRESM) &&
- (int_enb0 & USB_FUNCTION_BITRSME)) {
- USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITRESM;
- RZA_IO_RegWrite_16(&USB20X.INTENB0, 0, USB_INTENB0_RSME_SHIFT, USB_INTENB0_RSME);
- /*usbx_function_USB_FUNCTION_Resume();*/
- suspendStateChanged(1);
- } else if (
- (int_sts0 & USB_FUNCTION_BITVBINT) &&
- (int_enb0 & USB_FUNCTION_BITVBSE)) {
- USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITVBINT;
-
- if (usbx_function_CheckVBUStaus() == DEVDRV_USBF_ON) {
- usbx_function_USB_FUNCTION_Attach();
- } else {
- usbx_function_USB_FUNCTION_Detach();
- }
- } else if (
- (int_sts0 & USB_FUNCTION_BITSOFR) &&
- (int_enb0 & USB_FUNCTION_BITSOFE)) {
- USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITSOFR;
- SOF((USB20X.FRMNUM & USB_FRMNUM_FRNM) >> USB_FRMNUM_FRNM_SHIFT);
- } else if (
- (int_sts0 & USB_FUNCTION_BITDVST) &&
- (int_enb0 & USB_FUNCTION_BITDVSE)) {
- USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITDVST;
- switch (int_sts0 & USB_FUNCTION_BITDVSQ) {
- case USB_FUNCTION_DS_POWR:
- break;
-
- case USB_FUNCTION_DS_DFLT:
- /*****************************************************************************
- * Function Name: usbx_function_USB_FUNCTION_BusReset
- * Description : This function is executed when the USB device is transitioned
- * : to POWERD_STATE. Sets the device descriptor according to the
- * : connection speed determined by the USB reset hand shake.
- * Arguments : none
- * Return Value : none
- *****************************************************************************/
- usbx_function_init_status(); /* memory clear */
-
-#if 0
- /* You would program those steps in USBCallback_busReset
- * if the system need the comment out steps.
- */
-
- if (usbx_function_is_hispeed() == USB_FUNCTION_HIGH_SPEED) {
- /* Device Descriptor reset */
- usbx_function_ResetDescriptor(USB_FUNCTION_HIGH_SPEED);
- } else {
- /* Device Descriptor reset */
- usbx_function_ResetDescriptor(USB_FUNCTION_FULL_SPEED);
- }
-#endif
- /* Default Control PIPE reset */
- /*****************************************************************************
- * Function Name: usbx_function_ResetDCP
- * Description : Initializes the default control pipe(DCP).
- * Outline : Reset default control pipe
- * Arguments : none
- * Return Value : none
- *****************************************************************************/
- USB20X.DCPCFG = 0;
- USB20X.DCPMAXP = 64; /*TODO: This value is copied from sample*/
-
- USB20X.CFIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
- USB20X.D0FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
- USB20X.D1FIFOSEL = (uint16_t)(USB_FUNCTION_BITMBW_8 | USB_FUNCTION_BITBYTE_LITTLE);
-
- busReset();
- break;
-
- case USB_FUNCTION_DS_ADDS:
- break;
-
- case USB_FUNCTION_DS_CNFG:
- break;
-
- case USB_FUNCTION_DS_SPD_POWR:
- case USB_FUNCTION_DS_SPD_DFLT:
- case USB_FUNCTION_DS_SPD_ADDR:
- case USB_FUNCTION_DS_SPD_CNFG:
- suspendStateChanged(0);
- /*usbx_function_USB_FUNCTION_Suspend();*/
- break;
-
- default:
- break;
- }
- } else if (
- (int_sts0 & USB_FUNCTION_BITBEMP) &&
- (int_enb0 & USB_FUNCTION_BITBEMP) &&
- ((int_sts3 & int_enb4) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) {
- /* ==== BEMP PIPE0 ==== */
- usbx_function_BEMPInterruptPIPE0(int_sts3, int_enb4, this, &USBHAL::EP0in);
- } else if (
- (int_sts0 & USB_FUNCTION_BITBRDY) &&
- (int_enb0 & USB_FUNCTION_BITBRDY) &&
- ((int_sts1 & int_enb2) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) {
- /* ==== BRDY PIPE0 ==== */
- usbx_function_BRDYInterruptPIPE0(int_sts1, int_enb2, this, &USBHAL::EP0out);
- } else if (
- (int_sts0 & USB_FUNCTION_BITNRDY) &&
- (int_enb0 & USB_FUNCTION_BITNRDY) &&
- ((int_sts2 & int_enb3) & g_usbx_function_bit_set[USB_FUNCTION_PIPE0])) {
- /* ==== NRDY PIPE0 ==== */
- usbx_function_NRDYInterruptPIPE0(int_sts2, int_enb3, this, NULL);
- } else if (
- (int_sts0 & USB_FUNCTION_BITCTRT) && (int_enb0 & USB_FUNCTION_BITCTRE)) {
- int_sts0 = USB20X.INTSTS0;
- USB20X.INTSTS0 = (uint16_t)~USB_FUNCTION_BITCTRT;
-
- if (((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) ||
- ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) ||
- ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND)) {
-
- /* remake EP0 into buffer */
- usbx_function_save_request();
- if ((USB20X.INTSTS0 & USB_FUNCTION_BITVALID) && (
- ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_RDDS) ||
- ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRDS) ||
- ((int_sts0 & USB_FUNCTION_BITCTSQ) == USB_FUNCTION_CS_WRND))) {
- /* New SETUP token received */
- /* Three dummy reads for cleearing interrupt requests */
- dumy_sts = USB20X.INTSTS0;
- dumy_sts = USB20X.INTSTS0;
- dumy_sts = USB20X.INTSTS0;
- return;
- }
- }
-
- switch (int_sts0 & USB_FUNCTION_BITCTSQ) {
- case USB_FUNCTION_CS_IDST:
- if (g_usbx_function_TestModeFlag == DEVDRV_USBF_YES) {
- /* ==== Test Mode ==== */
- usbx_function_USB_FUNCTION_TestMode();
- }
- /* Needs not procedure in this state */
- break;
-
- case USB_FUNCTION_CS_RDDS:
- /* Reads a setup packet */
- EP0setupCallback();
- break;
-
- case USB_FUNCTION_CS_WRDS:
- /* Original code was the SetDescriptor was called */
- EP0setupCallback();
- break;
-
- case USB_FUNCTION_CS_WRND:
- EP0setupCallback();
-
- /*The EP0setupCallback should finish in successful */
- usbx_function_set_pid_buf(USB_FUNCTION_PIPE0);
-
- RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
- break;
-
- case USB_FUNCTION_CS_RDSS:
- RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
- break;
-
- case USB_FUNCTION_CS_WRSS:
- RZA_IO_RegWrite_16(&USB20X.DCPCTR, 1, USB_DCPCTR_CCPL_SHIFT, USB_DCPCTR_CCPL);
- break;
-
- case USB_FUNCTION_CS_SQER:
- usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
- break;
-
- default:
- usbx_function_set_pid_stall(USB_FUNCTION_PIPE0);
- break;
- }
- } else if (
- (int_sts0 & USB_FUNCTION_BITBEMP) &&
- (int_enb0 & USB_FUNCTION_BITBEMP) &&
- (int_sts3 & int_enb4) ) {
- /* ==== BEMP PIPEx ==== */
- usbx_function_BEMPInterrupt(int_sts3, int_enb4, this, epCallback);
- } else if (
- (int_sts0 & USB_FUNCTION_BITBRDY) &&
- (int_enb0 & USB_FUNCTION_BITBRDY) &&
- (int_sts1 & int_enb2) ) {
- /* ==== BRDY PIPEx ==== */
- usbx_function_BRDYInterrupt(int_sts1, int_enb2, this, epCallback);
- } else if (
- (int_sts0 & USB_FUNCTION_BITNRDY) &&
- (int_enb0 & USB_FUNCTION_BITNRDY) &&
- (int_sts2 & int_enb3)) {
- /* ==== NRDY PIPEx ==== */
- usbx_function_NRDYInterrupt(int_sts2, int_enb3, this, epCallback);
- } else {
- /* Do Nothing */
- }
-
- /* Three dummy reads for cleearing interrupt requests */
- dumy_sts = USB20X.INTSTS0;
- dumy_sts = USB20X.INTSTS1;
-}
-
-/*************************************************************************/
-#endif
-/*************************************************************************/
-/*EOF*/
--- a/Drivers/USBDevice/USBDevice/USBHAL_STM32F4.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,416 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#if defined(TARGET_STM32F4)
-
-#include "USBHAL.h"
-#include "USBRegs_STM32.h"
-#include "pinmap.h"
-
-USBHAL * USBHAL::instance;
-
-static volatile int epComplete = 0;
-
-static uint32_t bufferEnd = 0;
-static const uint32_t rxFifoSize = 512;
-static uint32_t rxFifoCount = 0;
-
-static uint32_t setupBuffer[MAX_PACKET_SIZE_EP0 >> 2];
-
-uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
- return 0;
-}
-
-USBHAL::USBHAL(void) {
- NVIC_DisableIRQ(OTG_FS_IRQn);
- epCallback[0] = &USBHAL::EP1_OUT_callback;
- epCallback[1] = &USBHAL::EP1_IN_callback;
- epCallback[2] = &USBHAL::EP2_OUT_callback;
- epCallback[3] = &USBHAL::EP2_IN_callback;
- epCallback[4] = &USBHAL::EP3_OUT_callback;
- epCallback[5] = &USBHAL::EP3_IN_callback;
-
- // Enable power and clocking
- RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
-
-#if defined(TARGET_STM32F407VG) || defined(TARGET_STM32F401RE) || defined(TARGET_STM32F411RE) || defined(TARGET_STM32F429ZI)
- pin_function(PA_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
- pin_function(PA_9, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLDOWN, GPIO_AF10_OTG_FS));
- pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS));
- pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
- pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
-#else
- pin_function(PA_8, STM_PIN_DATA(2, 10));
- pin_function(PA_9, STM_PIN_DATA(0, 0));
- pin_function(PA_10, STM_PIN_DATA(2, 10));
- pin_function(PA_11, STM_PIN_DATA(2, 10));
- pin_function(PA_12, STM_PIN_DATA(2, 10));
-
- // Set ID pin to open drain with pull-up resistor
- pin_mode(PA_10, OpenDrain);
- GPIOA->PUPDR &= ~(0x3 << 20);
- GPIOA->PUPDR |= 1 << 20;
-
- // Set VBUS pin to open drain
- pin_mode(PA_9, OpenDrain);
-#endif
-
- RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
-
- // Enable interrupts
- OTG_FS->GREGS.GAHBCFG |= (1 << 0);
-
- // Turnaround time to maximum value - too small causes packet loss
- OTG_FS->GREGS.GUSBCFG |= (0xF << 10);
-
- // Unmask global interrupts
- OTG_FS->GREGS.GINTMSK |= (1 << 3) | // SOF
- (1 << 4) | // RX FIFO not empty
- (1 << 12); // USB reset
-
- OTG_FS->DREGS.DCFG |= (0x3 << 0) | // Full speed
- (1 << 2); // Non-zero-length status OUT handshake
-
- OTG_FS->GREGS.GCCFG |= (1 << 19) | // Enable VBUS sensing
- (1 << 16); // Power Up
-
- instance = this;
- NVIC_SetVector(OTG_FS_IRQn, (uint32_t)&_usbisr);
- NVIC_SetPriority(OTG_FS_IRQn, 1);
-}
-
-USBHAL::~USBHAL(void) {
-}
-
-void USBHAL::connect(void) {
- NVIC_EnableIRQ(OTG_FS_IRQn);
-}
-
-void USBHAL::disconnect(void) {
- NVIC_DisableIRQ(OTG_FS_IRQn);
-}
-
-void USBHAL::configureDevice(void) {
- // Not needed
-}
-
-void USBHAL::unconfigureDevice(void) {
- // Not needed
-}
-
-void USBHAL::setAddress(uint8_t address) {
- OTG_FS->DREGS.DCFG |= (address << 4);
- EP0write(0, 0);
-}
-
-bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
- uint32_t flags) {
- uint32_t epIndex = endpoint >> 1;
-
- uint32_t type;
- switch (endpoint) {
- case EP0IN:
- case EP0OUT:
- type = 0;
- break;
- case EPISO_IN:
- case EPISO_OUT:
- type = 1;
- case EPBULK_IN:
- case EPBULK_OUT:
- type = 2;
- break;
- case EPINT_IN:
- case EPINT_OUT:
- type = 3;
- break;
- }
-
- // Generic in or out EP controls
- uint32_t control = (maxPacket << 0) | // Packet size
- (1 << 15) | // Active endpoint
- (type << 18); // Endpoint type
-
- if (endpoint & 0x1) { // In Endpoint
- // Set up the Tx FIFO
- if (endpoint == EP0IN) {
- OTG_FS->GREGS.DIEPTXF0_HNPTXFSIZ = ((maxPacket >> 2) << 16) |
- (bufferEnd << 0);
- }
- else {
- OTG_FS->GREGS.DIEPTXF[epIndex - 1] = ((maxPacket >> 2) << 16) |
- (bufferEnd << 0);
- }
- bufferEnd += maxPacket >> 2;
-
- // Set the In EP specific control settings
- if (endpoint != EP0IN) {
- control |= (1 << 28); // SD0PID
- }
-
- control |= (epIndex << 22) | // TxFIFO index
- (1 << 27); // SNAK
- OTG_FS->INEP_REGS[epIndex].DIEPCTL = control;
-
- // Unmask the interrupt
- OTG_FS->DREGS.DAINTMSK |= (1 << epIndex);
- }
- else { // Out endpoint
- // Set the out EP specific control settings
- control |= (1 << 26); // CNAK
- OTG_FS->OUTEP_REGS[epIndex].DOEPCTL = control;
-
- // Unmask the interrupt
- OTG_FS->DREGS.DAINTMSK |= (1 << (epIndex + 16));
- }
- return true;
-}
-
-// read setup packet
-void USBHAL::EP0setup(uint8_t *buffer) {
- memcpy(buffer, setupBuffer, MAX_PACKET_SIZE_EP0);
-}
-
-void USBHAL::EP0readStage(void) {
-}
-
-void USBHAL::EP0read(void) {
-}
-
-uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
- uint32_t* buffer32 = (uint32_t *) buffer;
- uint32_t length = rxFifoCount;
- for (uint32_t i = 0; i < length; i += 4) {
- buffer32[i >> 2] = OTG_FS->FIFO[0][0];
- }
-
- rxFifoCount = 0;
- return length;
-}
-
-void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
- endpointWrite(0, buffer, size);
-}
-
-void USBHAL::EP0getWriteResult(void) {
-}
-
-void USBHAL::EP0stall(void) {
- // If we stall the out endpoint here then we have problems transferring
- // and setup requests after the (stalled) get device qualifier requests.
- // TODO: Find out if this is correct behavior, or whether we are doing
- // something else wrong
- stallEndpoint(EP0IN);
-// stallEndpoint(EP0OUT);
-}
-
-EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
- uint32_t epIndex = endpoint >> 1;
- uint32_t size = (1 << 19) | // 1 packet
- (maximumSize << 0); // Packet size
-// if (endpoint == EP0OUT) {
- size |= (1 << 29); // 1 setup packet
-// }
- OTG_FS->OUTEP_REGS[epIndex].DOEPTSIZ = size;
- OTG_FS->OUTEP_REGS[epIndex].DOEPCTL |= (1 << 31) | // Enable endpoint
- (1 << 26); // Clear NAK
-
- epComplete &= ~(1 << endpoint);
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {
- if (!(epComplete & (1 << endpoint))) {
- return EP_PENDING;
- }
-
- uint32_t* buffer32 = (uint32_t *) buffer;
- uint32_t length = rxFifoCount;
- for (uint32_t i = 0; i < length; i += 4) {
- buffer32[i >> 2] = OTG_FS->FIFO[endpoint >> 1][0];
- }
- rxFifoCount = 0;
- *bytesRead = length;
- return EP_COMPLETED;
-}
-
-EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
- uint32_t epIndex = endpoint >> 1;
- OTG_FS->INEP_REGS[epIndex].DIEPTSIZ = (1 << 19) | // 1 packet
- (size << 0); // Size of packet
- OTG_FS->INEP_REGS[epIndex].DIEPCTL |= (1 << 31) | // Enable endpoint
- (1 << 26); // CNAK
- OTG_FS->DREGS.DIEPEMPMSK = (1 << epIndex);
-
- while ((OTG_FS->INEP_REGS[epIndex].DTXFSTS & 0XFFFF) < ((size + 3) >> 2));
-
- for (uint32_t i=0; i<(size + 3) >> 2; i++, data+=4) {
- OTG_FS->FIFO[epIndex][0] = *(uint32_t *)data;
- }
-
- epComplete &= ~(1 << endpoint);
-
- return EP_PENDING;
-}
-
-EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
- if (epComplete & (1 << endpoint)) {
- epComplete &= ~(1 << endpoint);
- return EP_COMPLETED;
- }
-
- return EP_PENDING;
-}
-
-void USBHAL::stallEndpoint(uint8_t endpoint) {
- if (endpoint & 0x1) { // In EP
- OTG_FS->INEP_REGS[endpoint >> 1].DIEPCTL |= (1 << 30) | // Disable
- (1 << 21); // Stall
- }
- else { // Out EP
- OTG_FS->DREGS.DCTL |= (1 << 9); // Set global out NAK
- OTG_FS->OUTEP_REGS[endpoint >> 1].DOEPCTL |= (1 << 30) | // Disable
- (1 << 21); // Stall
- }
-}
-
-void USBHAL::unstallEndpoint(uint8_t endpoint) {
-
-}
-
-bool USBHAL::getEndpointStallState(uint8_t endpoint) {
- return false;
-}
-
-void USBHAL::remoteWakeup(void) {
-}
-
-
-void USBHAL::_usbisr(void) {
- instance->usbisr();
-}
-
-
-void USBHAL::usbisr(void) {
- if (OTG_FS->GREGS.GINTSTS & (1 << 11)) { // USB Suspend
- suspendStateChanged(1);
- };
-
- if (OTG_FS->GREGS.GINTSTS & (1 << 12)) { // USB Reset
- suspendStateChanged(0);
-
- // Set SNAK bits
- OTG_FS->OUTEP_REGS[0].DOEPCTL |= (1 << 27);
- OTG_FS->OUTEP_REGS[1].DOEPCTL |= (1 << 27);
- OTG_FS->OUTEP_REGS[2].DOEPCTL |= (1 << 27);
- OTG_FS->OUTEP_REGS[3].DOEPCTL |= (1 << 27);
-
- OTG_FS->DREGS.DIEPMSK = (1 << 0);
-
- bufferEnd = 0;
-
- // Set the receive FIFO size
- OTG_FS->GREGS.GRXFSIZ = rxFifoSize >> 2;
- bufferEnd += rxFifoSize >> 2;
-
- // Create the endpoints, and wait for setup packets on out EP0
- realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);
- realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);
- endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0);
-
- OTG_FS->GREGS.GINTSTS = (1 << 12);
- }
-
- if (OTG_FS->GREGS.GINTSTS & (1 << 4)) { // RX FIFO not empty
- uint32_t status = OTG_FS->GREGS.GRXSTSP;
-
- uint32_t endpoint = (status & 0xF) << 1;
- uint32_t length = (status >> 4) & 0x7FF;
- uint32_t type = (status >> 17) & 0xF;
-
- rxFifoCount = length;
-
- if (type == 0x6) {
- // Setup packet
- for (uint32_t i=0; i<length; i+=4) {
- setupBuffer[i >> 2] = OTG_FS->FIFO[0][i >> 2];
- }
- rxFifoCount = 0;
- }
-
- if (type == 0x4) {
- // Setup complete
- EP0setupCallback();
- endpointRead(EP0OUT, MAX_PACKET_SIZE_EP0);
- }
-
- if (type == 0x2) {
- // Out packet
- if (endpoint == EP0OUT) {
- EP0out();
- }
- else {
- epComplete |= (1 << endpoint);
- if ((instance->*(epCallback[endpoint - 2]))()) {
- epComplete &= (1 << endpoint);
- }
- }
- }
-
- for (uint32_t i=0; i<rxFifoCount; i+=4) {
- (void) OTG_FS->FIFO[0][0];
- }
- OTG_FS->GREGS.GINTSTS = (1 << 4);
- }
-
- if (OTG_FS->GREGS.GINTSTS & (1 << 18)) { // In endpoint interrupt
- // Loop through the in endpoints
- for (uint32_t i=0; i<4; i++) {
- if (OTG_FS->DREGS.DAINT & (1 << i)) { // Interrupt is on endpoint
-
- if (OTG_FS->INEP_REGS[i].DIEPINT & (1 << 7)) {// Tx FIFO empty
- // If the Tx FIFO is empty on EP0 we need to send a further
- // packet, so call EP0in()
- if (i == 0) {
- EP0in();
- }
- // Clear the interrupt
- OTG_FS->INEP_REGS[i].DIEPINT = (1 << 7);
- // Stop firing Tx empty interrupts
- // Will get turned on again if another write is called
- OTG_FS->DREGS.DIEPEMPMSK &= ~(1 << i);
- }
-
- // If the transfer is complete
- if (OTG_FS->INEP_REGS[i].DIEPINT & (1 << 0)) { // Tx Complete
- epComplete |= (1 << (1 + (i << 1)));
- OTG_FS->INEP_REGS[i].DIEPINT = (1 << 0);
- }
- }
- }
- OTG_FS->GREGS.GINTSTS = (1 << 18);
- }
-
- if (OTG_FS->GREGS.GINTSTS & (1 << 3)) { // Start of frame
- SOF((OTG_FS->GREGS.GRXSTSR >> 17) & 0xF);
- OTG_FS->GREGS.GINTSTS = (1 << 3);
- }
-}
-
-
-#endif
--- a/Drivers/USBDevice/USBDevice/USBRegs_STM32.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/**
- ******************************************************************************
- * @file usb_regs.h
- * @author MCD Application Team
- * @version V2.1.0
- * @date 19-March-2012
- * @brief hardware registers
- ******************************************************************************
- * @attention
- *
- * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
-
-#ifndef __USB_OTG_REGS_H__
-#define __USB_OTG_REGS_H__
-
-typedef struct //000h
-{
- __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/
- __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/
- __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/
- __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/
- __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/
- __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/
- __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/
- __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/
- __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/
- __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/
- __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/
- __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/
- uint32_t Reserved30[2]; /* Reserved 030h*/
- __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/
- __IO uint32_t CID; /* User ID Register 03Ch*/
- uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/
- __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/
- __IO uint32_t DIEPTXF[3];/* dev Periodic Transmit FIFO */
-}
-USB_OTG_GREGS;
-
-typedef struct // 800h
-{
- __IO uint32_t DCFG; /* dev Configuration Register 800h*/
- __IO uint32_t DCTL; /* dev Control Register 804h*/
- __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/
- uint32_t Reserved0C; /* Reserved 80Ch*/
- __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/
- __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/
- __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/
- __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/
- uint32_t Reserved20; /* Reserved 820h*/
- uint32_t Reserved9; /* Reserved 824h*/
- __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/
- __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/
- __IO uint32_t DTHRCTL; /* dev thr 830h*/
- __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/
-}
-USB_OTG_DREGS;
-
-typedef struct
-{
- __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/
- uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/
- __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/
- uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/
- __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/
- uint32_t Reserved14;
- __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/
- uint32_t Reserved1C; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/
-}
-USB_OTG_INEPREGS;
-
-typedef struct
-{
- __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/
- uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/
- __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/
- uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/
- __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/
- uint32_t Reserved14[3];
-}
-USB_OTG_OUTEPREGS;
-
-typedef struct
-{
- __IO uint32_t HCFG; /* Host Configuration Register 400h*/
- __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/
- __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/
- uint32_t Reserved40C; /* Reserved 40Ch*/
- __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/
- __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/
- __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/
-}
-USB_OTG_HREGS;
-
-typedef struct
-{
- __IO uint32_t HCCHAR;
- __IO uint32_t HCSPLT;
- __IO uint32_t HCINT;
- __IO uint32_t HCINTMSK;
- __IO uint32_t HCTSIZ;
- uint32_t Reserved[3];
-}
-USB_OTG_HC_REGS;
-
-typedef struct
-{
- USB_OTG_GREGS GREGS;
- uint32_t RESERVED0[188];
- USB_OTG_HREGS HREGS;
- uint32_t RESERVED1[9];
- __IO uint32_t HPRT;
- uint32_t RESERVED2[47];
- USB_OTG_HC_REGS HC_REGS[8];
- uint32_t RESERVED3[128];
- USB_OTG_DREGS DREGS;
- uint32_t RESERVED4[50];
- USB_OTG_INEPREGS INEP_REGS[4];
- uint32_t RESERVED5[96];
- USB_OTG_OUTEPREGS OUTEP_REGS[4];
- uint32_t RESERVED6[160];
- __IO uint32_t PCGCCTL;
- uint32_t RESERVED7[127];
- __IO uint32_t FIFO[4][1024];
-}
-USB_OTG_CORE_REGS;
-
-
-#define OTG_FS_BASE (AHB2PERIPH_BASE + 0x0000)
-#define OTG_FS ((USB_OTG_CORE_REGS *) OTG_FS_BASE)
-
-#endif //__USB_OTG_REGS_H__
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
-
--- a/Drivers/USBDevice/USBHID/USBHID.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBHAL.h"
-#include "USBHID.h"
-
-
-USBHID::USBHID(uint8_t output_report_length, uint8_t input_report_length, uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect): USBDevice(vendor_id, product_id, product_release)
-{
- output_length = output_report_length;
- input_length = input_report_length;
- if(connect) {
- USBDevice::connect();
- }
-}
-
-
-bool USBHID::send(HID_REPORT *report)
-{
- return write(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
-}
-
-bool USBHID::sendNB(HID_REPORT *report)
-{
- return writeNB(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);
-}
-
-
-bool USBHID::read(HID_REPORT *report)
-{
- uint32_t bytesRead = 0;
- bool result;
- result = USBDevice::readEP(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
- if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
- return false;
- report->length = bytesRead;
- return result;
-}
-
-
-bool USBHID::readNB(HID_REPORT *report)
-{
- uint32_t bytesRead = 0;
- bool result;
- result = USBDevice::readEP_NB(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);
- // if readEP_NB did not succeed, does not issue a readStart
- if (!result)
- return false;
- report->length = bytesRead;
- if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
- return false;
- return result;
-}
-
-
-uint16_t USBHID::reportDescLength() {
- reportDesc();
- return reportLength;
-}
-
-
-
-//
-// Route callbacks from lower layers to class(es)
-//
-
-
-// Called in ISR context
-// Called by USBDevice on Endpoint0 request
-// This is used to handle extensions to standard requests
-// and class specific requests
-// Return true if class handles this request
-bool USBHID::USBCallback_request() {
- bool success = false;
- CONTROL_TRANSFER * transfer = getTransferPtr();
- uint8_t *hidDescriptor;
-
- // Process additional standard requests
-
- if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
- {
- switch (transfer->setup.bRequest)
- {
- case GET_DESCRIPTOR:
- switch (DESCRIPTOR_TYPE(transfer->setup.wValue))
- {
- case REPORT_DESCRIPTOR:
- if ((reportDesc() != NULL) \
- && (reportDescLength() != 0))
- {
- transfer->remaining = reportDescLength();
- transfer->ptr = reportDesc();
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- }
- break;
- case HID_DESCRIPTOR:
- // Find the HID descriptor, after the configuration descriptor
- hidDescriptor = findDescriptor(HID_DESCRIPTOR);
- if (hidDescriptor != NULL)
- {
- transfer->remaining = HID_DESCRIPTOR_LENGTH;
- transfer->ptr = hidDescriptor;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- }
- break;
-
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
-
- // Process class-specific requests
-
- if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
- {
- switch (transfer->setup.bRequest)
- {
- case SET_REPORT:
- // First byte will be used for report ID
- outputReport.data[0] = transfer->setup.wValue & 0xff;
- outputReport.length = transfer->setup.wLength + 1;
-
- transfer->remaining = sizeof(outputReport.data) - 1;
- transfer->ptr = &outputReport.data[1];
- transfer->direction = HOST_TO_DEVICE;
- transfer->notify = true;
- success = true;
- default:
- break;
- }
- }
-
- return success;
-}
-
-
-#define DEFAULT_CONFIGURATION (1)
-
-
-// Called in ISR context
-// Set configuration. Return false if the
-// configuration is not supported
-bool USBHID::USBCallback_setConfiguration(uint8_t configuration) {
- if (configuration != DEFAULT_CONFIGURATION) {
- return false;
- }
-
- // Configure endpoints > 0
- addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
- addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
-
- // We activate the endpoint to be able to recceive data
- readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
- return true;
-}
-
-
-uint8_t * USBHID::stringIinterfaceDesc() {
- static uint8_t stringIinterfaceDescriptor[] = {
- 0x08, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'H',0,'I',0,'D',0, //bString iInterface - HID
- };
- return stringIinterfaceDescriptor;
-}
-
-uint8_t * USBHID::stringIproductDesc() {
- static uint8_t stringIproductDescriptor[] = {
- 0x16, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device
- };
- return stringIproductDescriptor;
-}
-
-
-
-uint8_t * USBHID::reportDesc() {
- static uint8_t reportDescriptor[] = {
- 0x06, LSB(0xFFAB), MSB(0xFFAB),
- 0x0A, LSB(0x0200), MSB(0x0200),
- 0xA1, 0x01, // Collection 0x01
- 0x75, 0x08, // report size = 8 bits
- 0x15, 0x00, // logical minimum = 0
- 0x26, 0xFF, 0x00, // logical maximum = 255
- 0x95, input_length, // report count
- 0x09, 0x01, // usage
- 0x81, 0x02, // Input (array)
- 0x95, output_length,// report count
- 0x09, 0x02, // usage
- 0x91, 0x02, // Output (array)
- 0xC0 // end collection
-
- };
- reportLength = sizeof(reportDescriptor);
- return reportDescriptor;
-}
-
-#define DEFAULT_CONFIGURATION (1)
-#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
- + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
- + (1 * HID_DESCRIPTOR_LENGTH) \
- + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
-
-uint8_t * USBHID::configurationDesc() {
- static uint8_t configurationDescriptor[] = {
- CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
- CONFIGURATION_DESCRIPTOR, // bDescriptorType
- LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
- MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
- 0x01, // bNumInterfaces
- DEFAULT_CONFIGURATION, // bConfigurationValue
- 0x00, // iConfiguration
- C_RESERVED | C_SELF_POWERED, // bmAttributes
- C_POWER(0), // bMaxPower
-
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x00, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x02, // bNumEndpoints
- HID_CLASS, // bInterfaceClass
- HID_SUBCLASS_NONE, // bInterfaceSubClass
- HID_PROTOCOL_NONE, // bInterfaceProtocol
- 0x00, // iInterface
-
- HID_DESCRIPTOR_LENGTH, // bLength
- HID_DESCRIPTOR, // bDescriptorType
- LSB(HID_VERSION_1_11), // bcdHID (LSB)
- MSB(HID_VERSION_1_11), // bcdHID (MSB)
- 0x00, // bCountryCode
- 0x01, // bNumDescriptors
- REPORT_DESCRIPTOR, // bDescriptorType
- (uint8_t)(LSB(this->reportDescLength())), // wDescriptorLength (LSB)
- (uint8_t)(MSB(this->reportDescLength())), // wDescriptorLength (MSB)
-
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_IN), // bEndpointAddress
- E_INTERRUPT, // bmAttributes
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 1, // bInterval (milliseconds)
-
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
- E_INTERRUPT, // bmAttributes
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 1, // bInterval (milliseconds)
- };
- return configurationDescriptor;
-}
--- a/Drivers/USBDevice/USBHID/USBHID.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USB_HID_H
-#define USB_HID_H
-
-/* These headers are included for child class. */
-#include "USBEndpoints.h"
-#include "USBDescriptor.h"
-#include "USBDevice_Types.h"
-
-#include "USBHID_Types.h"
-#include "USBDevice.h"
-
-
-/**
- * USBHID example
- * @code
- * #include "mbed.h"
- * #include "USBHID.h"
- *
- * USBHID hid;
- * HID_REPORT recv;
- * BusOut leds(LED1,LED2,LED3,LED4);
- *
- * int main(void) {
- * while (1) {
- * hid.read(&recv);
- * leds = recv.data[0];
- * }
- * }
- * @endcode
- */
-
-class USBHID: public USBDevice {
-public:
-
- /**
- * Constructor
- *
- * @param output_report_length Maximum length of a sent report (up to 64 bytes) (default: 64 bytes)
- * @param input_report_length Maximum length of a received report (up to 64 bytes) (default: 64 bytes)
- * @param vendor_id Your vendor_id
- * @param product_id Your product_id
- * @param product_release Your preoduct_release
- * @param connect Connect the device
- */
- USBHID(uint8_t output_report_length = 64, uint8_t input_report_length = 64, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0006, uint16_t product_release = 0x0001, bool connect = true);
-
-
- /**
- * Send a Report. warning: blocking
- *
- * @param report Report which will be sent (a report is defined by all data and the length)
- * @returns true if successful
- */
- bool send(HID_REPORT *report);
-
-
- /**
- * Send a Report. warning: non blocking
- *
- * @param report Report which will be sent (a report is defined by all data and the length)
- * @returns true if successful
- */
- bool sendNB(HID_REPORT *report);
-
- /**
- * Read a report: blocking
- *
- * @param report pointer to the report to fill
- * @returns true if successful
- */
- bool read(HID_REPORT * report);
-
- /**
- * Read a report: non blocking
- *
- * @param report pointer to the report to fill
- * @returns true if successful
- */
- bool readNB(HID_REPORT * report);
-
-protected:
- uint16_t reportLength;
-
- /*
- * Get the Report descriptor
- *
- * @returns pointer to the report descriptor
- */
- virtual uint8_t * reportDesc();
-
- /*
- * Get the length of the report descriptor
- *
- * @returns the length of the report descriptor
- */
- virtual uint16_t reportDescLength();
-
- /*
- * Get string product descriptor
- *
- * @returns pointer to the string product descriptor
- */
- virtual uint8_t * stringIproductDesc();
-
- /*
- * Get string interface descriptor
- *
- * @returns pointer to the string interface descriptor
- */
- virtual uint8_t * stringIinterfaceDesc();
-
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
-
- /*
- * HID Report received by SET_REPORT request. Warning: Called in ISR context
- * First byte of data will be the report ID
- *
- * @param report Data and length received
- */
- virtual void HID_callbackSetReport(HID_REPORT *report){};
-
-
- /*
- * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
- * This is used to handle extensions to standard requests
- * and class specific requests
- *
- * @returns true if class handles this request
- */
- virtual bool USBCallback_request();
-
-
- /*
- * Called by USBDevice layer. Set configuration of the device.
- * For instance, you can add all endpoints that you need on this function.
- *
- * @param configuration Number of the configuration
- * @returns true if class handles this request
- */
- virtual bool USBCallback_setConfiguration(uint8_t configuration);
-
-private:
- HID_REPORT outputReport;
- uint8_t output_length;
- uint8_t input_length;
-};
-
-#endif
--- a/Drivers/USBDevice/USBHID/USBHID_Types.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBCLASS_HID_TYPES
-#define USBCLASS_HID_TYPES
-
-#include <stdint.h>
-
-/* */
-#define HID_VERSION_1_11 (0x0111)
-
-/* HID Class */
-#define HID_CLASS (3)
-#define HID_SUBCLASS_NONE (0)
-#define HID_PROTOCOL_NONE (0)
-
-/* Descriptors */
-#define HID_DESCRIPTOR (33)
-#define HID_DESCRIPTOR_LENGTH (0x09)
-#define REPORT_DESCRIPTOR (34)
-
-/* Class requests */
-#define GET_REPORT (0x1)
-#define GET_IDLE (0x2)
-#define SET_REPORT (0x9)
-#define SET_IDLE (0xa)
-
-/* HID Class Report Descriptor */
-/* Short items: size is 0, 1, 2 or 3 specifying 0, 1, 2 or 4 (four) bytes */
-/* of data as per HID Class standard */
-
-/* Main items */
-#define INPUT(size) (0x80 | size)
-#define OUTPUT(size) (0x90 | size)
-#define FEATURE(size) (0xb0 | size)
-#define COLLECTION(size) (0xa0 | size)
-#define END_COLLECTION(size) (0xc0 | size)
-
-/* Global items */
-#define USAGE_PAGE(size) (0x04 | size)
-#define LOGICAL_MINIMUM(size) (0x14 | size)
-#define LOGICAL_MAXIMUM(size) (0x24 | size)
-#define PHYSICAL_MINIMUM(size) (0x34 | size)
-#define PHYSICAL_MAXIMUM(size) (0x44 | size)
-#define UNIT_EXPONENT(size) (0x54 | size)
-#define UNIT(size) (0x64 | size)
-#define REPORT_SIZE(size) (0x74 | size)
-#define REPORT_ID(size) (0x84 | size)
-#define REPORT_COUNT(size) (0x94 | size)
-#define PUSH(size) (0xa4 | size)
-#define POP(size) (0xb4 | size)
-
-/* Local items */
-#define USAGE(size) (0x08 | size)
-#define USAGE_MINIMUM(size) (0x18 | size)
-#define USAGE_MAXIMUM(size) (0x28 | size)
-#define DESIGNATOR_INDEX(size) (0x38 | size)
-#define DESIGNATOR_MINIMUM(size) (0x48 | size)
-#define DESIGNATOR_MAXIMUM(size) (0x58 | size)
-#define STRING_INDEX(size) (0x78 | size)
-#define STRING_MINIMUM(size) (0x88 | size)
-#define STRING_MAXIMUM(size) (0x98 | size)
-#define DELIMITER(size) (0xa8 | size)
-
-/* HID Report */
-/* Where report IDs are used the first byte of 'data' will be the */
-/* report ID and 'length' will include this report ID byte. */
-
-#define MAX_HID_REPORT_SIZE (64)
-
-typedef struct {
- uint32_t length;
- uint8_t data[MAX_HID_REPORT_SIZE];
-} HID_REPORT;
-
-#endif
--- a/Drivers/USBDevice/USBHID/USBKeyboard.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,553 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-
-#include "USBKeyboard.h"
-
-#define REPORT_ID_KEYBOARD 1
-#define REPORT_ID_VOLUME 3
-
-
-typedef struct {
- unsigned char usage;
- unsigned char modifier;
-} KEYMAP;
-
-#ifdef US_KEYBOARD
-/* US keyboard (as HID standard) */
-#define KEYMAP_SIZE (152)
-const KEYMAP keymap[KEYMAP_SIZE] = {
- {0, 0}, /* NUL */
- {0, 0}, /* SOH */
- {0, 0}, /* STX */
- {0, 0}, /* ETX */
- {0, 0}, /* EOT */
- {0, 0}, /* ENQ */
- {0, 0}, /* ACK */
- {0, 0}, /* BEL */
- {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */
- {0x2b, 0}, /* TAB */ /* Keyboard Tab */
- {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */
- {0, 0}, /* VT */
- {0, 0}, /* FF */
- {0, 0}, /* CR */
- {0, 0}, /* SO */
- {0, 0}, /* SI */
- {0, 0}, /* DEL */
- {0, 0}, /* DC1 */
- {0, 0}, /* DC2 */
- {0, 0}, /* DC3 */
- {0, 0}, /* DC4 */
- {0, 0}, /* NAK */
- {0, 0}, /* SYN */
- {0, 0}, /* ETB */
- {0, 0}, /* CAN */
- {0, 0}, /* EM */
- {0, 0}, /* SUB */
- {0, 0}, /* ESC */
- {0, 0}, /* FS */
- {0, 0}, /* GS */
- {0, 0}, /* RS */
- {0, 0}, /* US */
- {0x2c, 0}, /* */
- {0x1e, KEY_SHIFT}, /* ! */
- {0x34, KEY_SHIFT}, /* " */
- {0x20, KEY_SHIFT}, /* # */
- {0x21, KEY_SHIFT}, /* $ */
- {0x22, KEY_SHIFT}, /* % */
- {0x24, KEY_SHIFT}, /* & */
- {0x34, 0}, /* ' */
- {0x26, KEY_SHIFT}, /* ( */
- {0x27, KEY_SHIFT}, /* ) */
- {0x25, KEY_SHIFT}, /* * */
- {0x2e, KEY_SHIFT}, /* + */
- {0x36, 0}, /* , */
- {0x2d, 0}, /* - */
- {0x37, 0}, /* . */
- {0x38, 0}, /* / */
- {0x27, 0}, /* 0 */
- {0x1e, 0}, /* 1 */
- {0x1f, 0}, /* 2 */
- {0x20, 0}, /* 3 */
- {0x21, 0}, /* 4 */
- {0x22, 0}, /* 5 */
- {0x23, 0}, /* 6 */
- {0x24, 0}, /* 7 */
- {0x25, 0}, /* 8 */
- {0x26, 0}, /* 9 */
- {0x33, KEY_SHIFT}, /* : */
- {0x33, 0}, /* ; */
- {0x36, KEY_SHIFT}, /* < */
- {0x2e, 0}, /* = */
- {0x37, KEY_SHIFT}, /* > */
- {0x38, KEY_SHIFT}, /* ? */
- {0x1f, KEY_SHIFT}, /* @ */
- {0x04, KEY_SHIFT}, /* A */
- {0x05, KEY_SHIFT}, /* B */
- {0x06, KEY_SHIFT}, /* C */
- {0x07, KEY_SHIFT}, /* D */
- {0x08, KEY_SHIFT}, /* E */
- {0x09, KEY_SHIFT}, /* F */
- {0x0a, KEY_SHIFT}, /* G */
- {0x0b, KEY_SHIFT}, /* H */
- {0x0c, KEY_SHIFT}, /* I */
- {0x0d, KEY_SHIFT}, /* J */
- {0x0e, KEY_SHIFT}, /* K */
- {0x0f, KEY_SHIFT}, /* L */
- {0x10, KEY_SHIFT}, /* M */
- {0x11, KEY_SHIFT}, /* N */
- {0x12, KEY_SHIFT}, /* O */
- {0x13, KEY_SHIFT}, /* P */
- {0x14, KEY_SHIFT}, /* Q */
- {0x15, KEY_SHIFT}, /* R */
- {0x16, KEY_SHIFT}, /* S */
- {0x17, KEY_SHIFT}, /* T */
- {0x18, KEY_SHIFT}, /* U */
- {0x19, KEY_SHIFT}, /* V */
- {0x1a, KEY_SHIFT}, /* W */
- {0x1b, KEY_SHIFT}, /* X */
- {0x1c, KEY_SHIFT}, /* Y */
- {0x1d, KEY_SHIFT}, /* Z */
- {0x2f, 0}, /* [ */
- {0x31, 0}, /* \ */
- {0x30, 0}, /* ] */
- {0x23, KEY_SHIFT}, /* ^ */
- {0x2d, KEY_SHIFT}, /* _ */
- {0x35, 0}, /* ` */
- {0x04, 0}, /* a */
- {0x05, 0}, /* b */
- {0x06, 0}, /* c */
- {0x07, 0}, /* d */
- {0x08, 0}, /* e */
- {0x09, 0}, /* f */
- {0x0a, 0}, /* g */
- {0x0b, 0}, /* h */
- {0x0c, 0}, /* i */
- {0x0d, 0}, /* j */
- {0x0e, 0}, /* k */
- {0x0f, 0}, /* l */
- {0x10, 0}, /* m */
- {0x11, 0}, /* n */
- {0x12, 0}, /* o */
- {0x13, 0}, /* p */
- {0x14, 0}, /* q */
- {0x15, 0}, /* r */
- {0x16, 0}, /* s */
- {0x17, 0}, /* t */
- {0x18, 0}, /* u */
- {0x19, 0}, /* v */
- {0x1a, 0}, /* w */
- {0x1b, 0}, /* x */
- {0x1c, 0}, /* y */
- {0x1d, 0}, /* z */
- {0x2f, KEY_SHIFT}, /* { */
- {0x31, KEY_SHIFT}, /* | */
- {0x30, KEY_SHIFT}, /* } */
- {0x35, KEY_SHIFT}, /* ~ */
- {0,0}, /* DEL */
-
- {0x3a, 0}, /* F1 */
- {0x3b, 0}, /* F2 */
- {0x3c, 0}, /* F3 */
- {0x3d, 0}, /* F4 */
- {0x3e, 0}, /* F5 */
- {0x3f, 0}, /* F6 */
- {0x40, 0}, /* F7 */
- {0x41, 0}, /* F8 */
- {0x42, 0}, /* F9 */
- {0x43, 0}, /* F10 */
- {0x44, 0}, /* F11 */
- {0x45, 0}, /* F12 */
-
- {0x46, 0}, /* PRINT_SCREEN */
- {0x47, 0}, /* SCROLL_LOCK */
- {0x39, 0}, /* CAPS_LOCK */
- {0x53, 0}, /* NUM_LOCK */
- {0x49, 0}, /* INSERT */
- {0x4a, 0}, /* HOME */
- {0x4b, 0}, /* PAGE_UP */
- {0x4e, 0}, /* PAGE_DOWN */
-
- {0x4f, 0}, /* RIGHT_ARROW */
- {0x50, 0}, /* LEFT_ARROW */
- {0x51, 0}, /* DOWN_ARROW */
- {0x52, 0}, /* UP_ARROW */
-};
-
-#else
-/* UK keyboard */
-#define KEYMAP_SIZE (152)
-const KEYMAP keymap[KEYMAP_SIZE] = {
- {0, 0}, /* NUL */
- {0, 0}, /* SOH */
- {0, 0}, /* STX */
- {0, 0}, /* ETX */
- {0, 0}, /* EOT */
- {0, 0}, /* ENQ */
- {0, 0}, /* ACK */
- {0, 0}, /* BEL */
- {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */
- {0x2b, 0}, /* TAB */ /* Keyboard Tab */
- {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */
- {0, 0}, /* VT */
- {0, 0}, /* FF */
- {0, 0}, /* CR */
- {0, 0}, /* SO */
- {0, 0}, /* SI */
- {0, 0}, /* DEL */
- {0, 0}, /* DC1 */
- {0, 0}, /* DC2 */
- {0, 0}, /* DC3 */
- {0, 0}, /* DC4 */
- {0, 0}, /* NAK */
- {0, 0}, /* SYN */
- {0, 0}, /* ETB */
- {0, 0}, /* CAN */
- {0, 0}, /* EM */
- {0, 0}, /* SUB */
- {0, 0}, /* ESC */
- {0, 0}, /* FS */
- {0, 0}, /* GS */
- {0, 0}, /* RS */
- {0, 0}, /* US */
- {0x2c, 0}, /* */
- {0x1e, KEY_SHIFT}, /* ! */
- {0x1f, KEY_SHIFT}, /* " */
- {0x32, 0}, /* # */
- {0x21, KEY_SHIFT}, /* $ */
- {0x22, KEY_SHIFT}, /* % */
- {0x24, KEY_SHIFT}, /* & */
- {0x34, 0}, /* ' */
- {0x26, KEY_SHIFT}, /* ( */
- {0x27, KEY_SHIFT}, /* ) */
- {0x25, KEY_SHIFT}, /* * */
- {0x2e, KEY_SHIFT}, /* + */
- {0x36, 0}, /* , */
- {0x2d, 0}, /* - */
- {0x37, 0}, /* . */
- {0x38, 0}, /* / */
- {0x27, 0}, /* 0 */
- {0x1e, 0}, /* 1 */
- {0x1f, 0}, /* 2 */
- {0x20, 0}, /* 3 */
- {0x21, 0}, /* 4 */
- {0x22, 0}, /* 5 */
- {0x23, 0}, /* 6 */
- {0x24, 0}, /* 7 */
- {0x25, 0}, /* 8 */
- {0x26, 0}, /* 9 */
- {0x33, KEY_SHIFT}, /* : */
- {0x33, 0}, /* ; */
- {0x36, KEY_SHIFT}, /* < */
- {0x2e, 0}, /* = */
- {0x37, KEY_SHIFT}, /* > */
- {0x38, KEY_SHIFT}, /* ? */
- {0x34, KEY_SHIFT}, /* @ */
- {0x04, KEY_SHIFT}, /* A */
- {0x05, KEY_SHIFT}, /* B */
- {0x06, KEY_SHIFT}, /* C */
- {0x07, KEY_SHIFT}, /* D */
- {0x08, KEY_SHIFT}, /* E */
- {0x09, KEY_SHIFT}, /* F */
- {0x0a, KEY_SHIFT}, /* G */
- {0x0b, KEY_SHIFT}, /* H */
- {0x0c, KEY_SHIFT}, /* I */
- {0x0d, KEY_SHIFT}, /* J */
- {0x0e, KEY_SHIFT}, /* K */
- {0x0f, KEY_SHIFT}, /* L */
- {0x10, KEY_SHIFT}, /* M */
- {0x11, KEY_SHIFT}, /* N */
- {0x12, KEY_SHIFT}, /* O */
- {0x13, KEY_SHIFT}, /* P */
- {0x14, KEY_SHIFT}, /* Q */
- {0x15, KEY_SHIFT}, /* R */
- {0x16, KEY_SHIFT}, /* S */
- {0x17, KEY_SHIFT}, /* T */
- {0x18, KEY_SHIFT}, /* U */
- {0x19, KEY_SHIFT}, /* V */
- {0x1a, KEY_SHIFT}, /* W */
- {0x1b, KEY_SHIFT}, /* X */
- {0x1c, KEY_SHIFT}, /* Y */
- {0x1d, KEY_SHIFT}, /* Z */
- {0x2f, 0}, /* [ */
- {0x64, 0}, /* \ */
- {0x30, 0}, /* ] */
- {0x23, KEY_SHIFT}, /* ^ */
- {0x2d, KEY_SHIFT}, /* _ */
- {0x35, 0}, /* ` */
- {0x04, 0}, /* a */
- {0x05, 0}, /* b */
- {0x06, 0}, /* c */
- {0x07, 0}, /* d */
- {0x08, 0}, /* e */
- {0x09, 0}, /* f */
- {0x0a, 0}, /* g */
- {0x0b, 0}, /* h */
- {0x0c, 0}, /* i */
- {0x0d, 0}, /* j */
- {0x0e, 0}, /* k */
- {0x0f, 0}, /* l */
- {0x10, 0}, /* m */
- {0x11, 0}, /* n */
- {0x12, 0}, /* o */
- {0x13, 0}, /* p */
- {0x14, 0}, /* q */
- {0x15, 0}, /* r */
- {0x16, 0}, /* s */
- {0x17, 0}, /* t */
- {0x18, 0}, /* u */
- {0x19, 0}, /* v */
- {0x1a, 0}, /* w */
- {0x1b, 0}, /* x */
- {0x1c, 0}, /* y */
- {0x1d, 0}, /* z */
- {0x2f, KEY_SHIFT}, /* { */
- {0x64, KEY_SHIFT}, /* | */
- {0x30, KEY_SHIFT}, /* } */
- {0x32, KEY_SHIFT}, /* ~ */
- {0,0}, /* DEL */
-
- {0x3a, 0}, /* F1 */
- {0x3b, 0}, /* F2 */
- {0x3c, 0}, /* F3 */
- {0x3d, 0}, /* F4 */
- {0x3e, 0}, /* F5 */
- {0x3f, 0}, /* F6 */
- {0x40, 0}, /* F7 */
- {0x41, 0}, /* F8 */
- {0x42, 0}, /* F9 */
- {0x43, 0}, /* F10 */
- {0x44, 0}, /* F11 */
- {0x45, 0}, /* F12 */
-
- {0x46, 0}, /* PRINT_SCREEN */
- {0x47, 0}, /* SCROLL_LOCK */
- {0x39, 0}, /* CAPS_LOCK */
- {0x53, 0}, /* NUM_LOCK */
- {0x49, 0}, /* INSERT */
- {0x4a, 0}, /* HOME */
- {0x4b, 0}, /* PAGE_UP */
- {0x4e, 0}, /* PAGE_DOWN */
-
- {0x4f, 0}, /* RIGHT_ARROW */
- {0x50, 0}, /* LEFT_ARROW */
- {0x51, 0}, /* DOWN_ARROW */
- {0x52, 0}, /* UP_ARROW */
-};
-#endif
-
-uint8_t * USBKeyboard::reportDesc() {
- static uint8_t reportDescriptor[] = {
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x06, // Keyboard
- COLLECTION(1), 0x01, // Application
- REPORT_ID(1), REPORT_ID_KEYBOARD,
-
- USAGE_PAGE(1), 0x07, // Key Codes
- USAGE_MINIMUM(1), 0xE0,
- USAGE_MAXIMUM(1), 0xE7,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- REPORT_SIZE(1), 0x01,
- REPORT_COUNT(1), 0x08,
- INPUT(1), 0x02, // Data, Variable, Absolute
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x08,
- INPUT(1), 0x01, // Constant
-
-
- REPORT_COUNT(1), 0x05,
- REPORT_SIZE(1), 0x01,
- USAGE_PAGE(1), 0x08, // LEDs
- USAGE_MINIMUM(1), 0x01,
- USAGE_MAXIMUM(1), 0x05,
- OUTPUT(1), 0x02, // Data, Variable, Absolute
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x03,
- OUTPUT(1), 0x01, // Constant
-
-
- REPORT_COUNT(1), 0x06,
- REPORT_SIZE(1), 0x08,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x65,
- USAGE_PAGE(1), 0x07, // Key Codes
- USAGE_MINIMUM(1), 0x00,
- USAGE_MAXIMUM(1), 0x65,
- INPUT(1), 0x00, // Data, Array
- END_COLLECTION(0),
-
- // Media Control
- USAGE_PAGE(1), 0x0C,
- USAGE(1), 0x01,
- COLLECTION(1), 0x01,
- REPORT_ID(1), REPORT_ID_VOLUME,
- USAGE_PAGE(1), 0x0C,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- REPORT_SIZE(1), 0x01,
- REPORT_COUNT(1), 0x07,
- USAGE(1), 0xB5, // Next Track
- USAGE(1), 0xB6, // Previous Track
- USAGE(1), 0xB7, // Stop
- USAGE(1), 0xCD, // Play / Pause
- USAGE(1), 0xE2, // Mute
- USAGE(1), 0xE9, // Volume Up
- USAGE(1), 0xEA, // Volume Down
- INPUT(1), 0x02, // Input (Data, Variable, Absolute)
- REPORT_COUNT(1), 0x01,
- INPUT(1), 0x01,
- END_COLLECTION(0),
- };
- reportLength = sizeof(reportDescriptor);
- return reportDescriptor;
-}
-
-
-bool USBKeyboard::EPINT_OUT_callback() {
- uint32_t bytesRead = 0;
- uint8_t led[65];
- USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
-
- // we take led[1] because led[0] is the report ID
- lock_status = led[1] & 0x07;
-
- // We activate the endpoint to be able to recceive data
- if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
- return false;
- return true;
-}
-
-uint8_t USBKeyboard::lockStatus() {
- return lock_status;
-}
-
-int USBKeyboard::_putc(int c) {
- return keyCode(c, keymap[c].modifier);
-}
-
-bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {
- // Send a simulated keyboard keypress. Returns true if successful.
- HID_REPORT report;
-
- report.data[0] = REPORT_ID_KEYBOARD;
- report.data[1] = modifier;
- report.data[2] = 0;
- report.data[3] = keymap[key].usage;
- report.data[4] = 0;
- report.data[5] = 0;
- report.data[6] = 0;
- report.data[7] = 0;
- report.data[8] = 0;
-
- report.length = 9;
-
- if (!send(&report)) {
- return false;
- }
-
- report.data[1] = 0;
- report.data[3] = 0;
-
- if (!send(&report)) {
- return false;
- }
-
- return true;
-
-}
-
-
-bool USBKeyboard::mediaControl(MEDIA_KEY key) {
- HID_REPORT report;
-
- report.data[0] = REPORT_ID_VOLUME;
- report.data[1] = (1 << key) & 0x7f;
-
- report.length = 2;
-
- if (!send(&report)) {
- return false;
- }
-
- report.data[0] = REPORT_ID_VOLUME;
- report.data[1] = 0;
-
- report.length = 2;
-
- return send(&report);
-}
-
-
-#define DEFAULT_CONFIGURATION (1)
-#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
- + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
- + (1 * HID_DESCRIPTOR_LENGTH) \
- + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
-
-uint8_t * USBKeyboard::configurationDesc() {
- static uint8_t configurationDescriptor[] = {
- CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
- CONFIGURATION_DESCRIPTOR, // bDescriptorType
- LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
- MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
- 0x01, // bNumInterfaces
- DEFAULT_CONFIGURATION, // bConfigurationValue
- 0x00, // iConfiguration
- C_RESERVED | C_SELF_POWERED, // bmAttributes
- C_POWER(0), // bMaxPowerHello World from Mbed
-
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x00, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x02, // bNumEndpoints
- HID_CLASS, // bInterfaceClass
- 1, // bInterfaceSubClass
- 1, // bInterfaceProtocol (keyboard)
- 0x00, // iInterface
-
- HID_DESCRIPTOR_LENGTH, // bLength
- HID_DESCRIPTOR, // bDescriptorType
- LSB(HID_VERSION_1_11), // bcdHID (LSB)
- MSB(HID_VERSION_1_11), // bcdHID (MSB)
- 0x00, // bCountryCode
- 0x01, // bNumDescriptors
- REPORT_DESCRIPTOR, // bDescriptorType
- (uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB)
- (uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB)
-
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_IN), // bEndpointAddress
- E_INTERRUPT, // bmAttributes
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 1, // bInterval (milliseconds)
-
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
- E_INTERRUPT, // bmAttributes
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 1, // bInterval (milliseconds)
- };
- return configurationDescriptor;
-}
--- a/Drivers/USBDevice/USBHID/USBKeyboard.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBKEYBOARD_H
-#define USBKEYBOARD_H
-
-#include "USBHID.h"
-#include "Stream.h"
-
-/* Modifiers */
-enum MODIFIER_KEY {
- KEY_CTRL = 1,
- KEY_SHIFT = 2,
- KEY_ALT = 4,
-};
-
-
-enum MEDIA_KEY {
- KEY_NEXT_TRACK, /*!< next Track Button */
- KEY_PREVIOUS_TRACK, /*!< Previous track Button */
- KEY_STOP, /*!< Stop Button */
- KEY_PLAY_PAUSE, /*!< Play/Pause Button */
- KEY_MUTE, /*!< Mute Button */
- KEY_VOLUME_UP, /*!< Volume Up Button */
- KEY_VOLUME_DOWN, /*!< Volume Down Button */
-};
-
-enum FUNCTION_KEY {
- KEY_F1 = 128, /* F1 key */
- KEY_F2, /* F2 key */
- KEY_F3, /* F3 key */
- KEY_F4, /* F4 key */
- KEY_F5, /* F5 key */
- KEY_F6, /* F6 key */
- KEY_F7, /* F7 key */
- KEY_F8, /* F8 key */
- KEY_F9, /* F9 key */
- KEY_F10, /* F10 key */
- KEY_F11, /* F11 key */
- KEY_F12, /* F12 key */
-
- KEY_PRINT_SCREEN, /* Print Screen key */
- KEY_SCROLL_LOCK, /* Scroll lock */
- KEY_CAPS_LOCK, /* caps lock */
- KEY_NUM_LOCK, /* num lock */
- KEY_INSERT, /* Insert key */
- KEY_HOME, /* Home key */
- KEY_PAGE_UP, /* Page Up key */
- KEY_PAGE_DOWN, /* Page Down key */
-
- RIGHT_ARROW, /* Right arrow */
- LEFT_ARROW, /* Left arrow */
- DOWN_ARROW, /* Down arrow */
- UP_ARROW, /* Up arrow */
-};
-
-/**
- * USBKeyboard example
- * @code
- *
- * #include "mbed.h"
- * #include "USBKeyboard.h"
- *
- * USBKeyboard key;
- *
- * int main(void)
- * {
- * while (1)
- * {
- * key.printf("Hello World\r\n");
- * wait(1);
- * }
- * }
- *
- * @endcode
- */
-class USBKeyboard: public USBHID, public Stream {
-public:
-
- /**
- * Constructor
- *
- *
- * @param leds Leds bus: first: NUM_LOCK, second: CAPS_LOCK, third: SCROLL_LOCK
- * @param vendor_id Your vendor_id (default: 0x1235)
- * @param product_id Your product_id (default: 0x0050)
- * @param product_release Your preoduct_release (default: 0x0001)
- *
- */
- USBKeyboard(uint16_t vendor_id = 0x1235, uint16_t product_id = 0x0050, uint16_t product_release = 0x0001):
- USBHID(0, 0, vendor_id, product_id, product_release, false) {
- lock_status = 0;
- connect();
- };
-
- /**
- * To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key
- *
- * @code
- * //To send CTRL + s (save)
- * keyboard.keyCode('s', KEY_CTRL);
- * @endcode
- *
- * @param modifier bit 0: KEY_CTRL, bit 1: KEY_SHIFT, bit 2: KEY_ALT (default: 0)
- * @param key character to send
- * @returns true if there is no error, false otherwise
- */
- bool keyCode(uint8_t key, uint8_t modifier = 0);
-
- /**
- * Send a character
- *
- * @param c character to be sent
- * @returns true if there is no error, false otherwise
- */
- virtual int _putc(int c);
-
- /**
- * Control media keys
- *
- * @param key media key pressed (KEY_NEXT_TRACK, KEY_PREVIOUS_TRACK, KEY_STOP, KEY_PLAY_PAUSE, KEY_MUTE, KEY_VOLUME_UP, KEY_VOLUME_DOWN)
- * @returns true if there is no error, false otherwise
- */
- bool mediaControl(MEDIA_KEY key);
-
- /*
- * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
- *
- * @returns pointer to the report descriptor
- */
- virtual uint8_t * reportDesc();
-
- /*
- * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
- *
- * @returns if handle by subclass, return true
- */
- virtual bool EPINT_OUT_callback();
-
- /**
- * Read status of lock keys. Useful to switch-on/off leds according to key pressed. Only the first three bits of the result is important:
- * - First bit: NUM_LOCK
- * - Second bit: CAPS_LOCK
- * - Third bit: SCROLL_LOCK
- *
- * @returns status of lock keys
- */
- uint8_t lockStatus();
-
-protected:
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
-private:
- //dummy otherwise it doesn,t compile (we must define all methods of an abstract class)
- virtual int _getc() {
- return -1;
- };
-
- uint8_t lock_status;
-
-};
-
-#endif
--- a/Drivers/USBDevice/USBHID/USBMouse.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,245 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBMouse.h"
-
-bool USBMouse::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
- switch (mouse_type) {
- case REL_MOUSE:
- while (x > 127) {
- if (!mouseSend(127, 0, button, z)) return false;
- x = x - 127;
- }
- while (x < -128) {
- if (!mouseSend(-128, 0, button, z)) return false;
- x = x + 128;
- }
- while (y > 127) {
- if (!mouseSend(0, 127, button, z)) return false;
- y = y - 127;
- }
- while (y < -128) {
- if (!mouseSend(0, -128, button, z)) return false;
- y = y + 128;
- }
- return mouseSend(x, y, button, z);
- case ABS_MOUSE:
- HID_REPORT report;
-
- report.data[0] = x & 0xff;
- report.data[1] = (x >> 8) & 0xff;
- report.data[2] = y & 0xff;
- report.data[3] = (y >> 8) & 0xff;
- report.data[4] = -z;
- report.data[5] = button & 0x07;
-
- report.length = 6;
-
- return send(&report);
- default:
- return false;
- }
-}
-
-bool USBMouse::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
- HID_REPORT report;
- report.data[0] = buttons & 0x07;
- report.data[1] = x;
- report.data[2] = y;
- report.data[3] = -z; // >0 to scroll down, <0 to scroll up
-
- report.length = 4;
-
- return send(&report);
-}
-
-bool USBMouse::move(int16_t x, int16_t y) {
- return update(x, y, button, 0);
-}
-
-bool USBMouse::scroll(int8_t z) {
- return update(0, 0, button, z);
-}
-
-
-bool USBMouse::doubleClick() {
- if (!click(MOUSE_LEFT))
- return false;
- wait(0.1);
- return click(MOUSE_LEFT);
-}
-
-bool USBMouse::click(uint8_t button) {
- if (!update(0, 0, button, 0))
- return false;
- wait(0.01);
- return update(0, 0, 0, 0);
-}
-
-bool USBMouse::press(uint8_t button_) {
- button = button_ & 0x07;
- return update(0, 0, button, 0);
-}
-
-bool USBMouse::release(uint8_t button_) {
- button = (button & (~button_)) & 0x07;
- return update(0, 0, button, 0);
-}
-
-
-uint8_t * USBMouse::reportDesc() {
-
- if (mouse_type == REL_MOUSE) {
- static uint8_t reportDescriptor[] = {
- USAGE_PAGE(1), 0x01, // Genric Desktop
- USAGE(1), 0x02, // Mouse
- COLLECTION(1), 0x01, // Application
- USAGE(1), 0x01, // Pointer
- COLLECTION(1), 0x00, // Physical
-
- REPORT_COUNT(1), 0x03,
- REPORT_SIZE(1), 0x01,
- USAGE_PAGE(1), 0x09, // Buttons
- USAGE_MINIMUM(1), 0x1,
- USAGE_MAXIMUM(1), 0x3,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- INPUT(1), 0x02,
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x05,
- INPUT(1), 0x01,
-
- REPORT_COUNT(1), 0x03,
- REPORT_SIZE(1), 0x08,
- USAGE_PAGE(1), 0x01,
- USAGE(1), 0x30, // X
- USAGE(1), 0x31, // Y
- USAGE(1), 0x38, // scroll
- LOGICAL_MINIMUM(1), 0x81,
- LOGICAL_MAXIMUM(1), 0x7f,
- INPUT(1), 0x06, // Relative data
-
- END_COLLECTION(0),
- END_COLLECTION(0),
- };
- reportLength = sizeof(reportDescriptor);
- return reportDescriptor;
- } else if (mouse_type == ABS_MOUSE) {
- static uint8_t reportDescriptor[] = {
-
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x02, // Mouse
- COLLECTION(1), 0x01, // Application
- USAGE(1), 0x01, // Pointer
- COLLECTION(1), 0x00, // Physical
-
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x30, // X
- USAGE(1), 0x31, // Y
- LOGICAL_MINIMUM(1), 0x00, // 0
- LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767
- REPORT_SIZE(1), 0x10,
- REPORT_COUNT(1), 0x02,
- INPUT(1), 0x02, // Data, Variable, Absolute
-
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x38, // scroll
- LOGICAL_MINIMUM(1), 0x81, // -127
- LOGICAL_MAXIMUM(1), 0x7f, // 127
- REPORT_SIZE(1), 0x08,
- REPORT_COUNT(1), 0x01,
- INPUT(1), 0x06, // Data, Variable, Relative
-
- USAGE_PAGE(1), 0x09, // Buttons
- USAGE_MINIMUM(1), 0x01,
- USAGE_MAXIMUM(1), 0x03,
- LOGICAL_MINIMUM(1), 0x00, // 0
- LOGICAL_MAXIMUM(1), 0x01, // 1
- REPORT_COUNT(1), 0x03,
- REPORT_SIZE(1), 0x01,
- INPUT(1), 0x02, // Data, Variable, Absolute
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x05,
- INPUT(1), 0x01, // Constant
-
- END_COLLECTION(0),
- END_COLLECTION(0)
- };
- reportLength = sizeof(reportDescriptor);
- return reportDescriptor;
- }
- return NULL;
-}
-
-#define DEFAULT_CONFIGURATION (1)
-#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
- + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
- + (1 * HID_DESCRIPTOR_LENGTH) \
- + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
-
-uint8_t * USBMouse::configurationDesc() {
- static uint8_t configurationDescriptor[] = {
- CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
- CONFIGURATION_DESCRIPTOR, // bDescriptorType
- LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
- MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
- 0x01, // bNumInterfaces
- DEFAULT_CONFIGURATION, // bConfigurationValue
- 0x00, // iConfiguration
- C_RESERVED | C_SELF_POWERED, // bmAttributes
- C_POWER(0), // bMaxPowerHello World from Mbed
-
- INTERFACE_DESCRIPTOR_LENGTH, // bLength
- INTERFACE_DESCRIPTOR, // bDescriptorType
- 0x00, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x02, // bNumEndpoints
- HID_CLASS, // bInterfaceClass
- 1, // bInterfaceSubClass
- 2, // bInterfaceProtocol (mouse)
- 0x00, // iInterface
-
- HID_DESCRIPTOR_LENGTH, // bLength
- HID_DESCRIPTOR, // bDescriptorType
- LSB(HID_VERSION_1_11), // bcdHID (LSB)
- MSB(HID_VERSION_1_11), // bcdHID (MSB)
- 0x00, // bCountryCode
- 0x01, // bNumDescriptors
- REPORT_DESCRIPTOR, // bDescriptorType
- (uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB)
- (uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB)
-
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_IN), // bEndpointAddress
- E_INTERRUPT, // bmAttributes
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 1, // bInterval (milliseconds)
-
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
- E_INTERRUPT, // bmAttributes
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 1, // bInterval (milliseconds)
- };
- return configurationDescriptor;
-}
--- a/Drivers/USBDevice/USBHID/USBMouse.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBMOUSE_H
-#define USBMOUSE_H
-
-#include "USBHID.h"
-
-#define REPORT_ID_MOUSE 2
-
-/* Common usage */
-
-enum MOUSE_BUTTON
-{
- MOUSE_LEFT = 1,
- MOUSE_RIGHT = 2,
- MOUSE_MIDDLE = 4,
-};
-
-/* X and Y limits */
-/* These values do not directly map to screen pixels */
-/* Zero may be interpreted as meaning 'no movement' */
-#define X_MIN_ABS (1) /*!< Minimum value on x-axis */
-#define Y_MIN_ABS (1) /*!< Minimum value on y-axis */
-#define X_MAX_ABS (0x7fff) /*!< Maximum value on x-axis */
-#define Y_MAX_ABS (0x7fff) /*!< Maximum value on y-axis */
-
-#define X_MIN_REL (-127) /*!< The maximum value that we can move to the left on the x-axis */
-#define Y_MIN_REL (-127) /*!< The maximum value that we can move up on the y-axis */
-#define X_MAX_REL (127) /*!< The maximum value that we can move to the right on the x-axis */
-#define Y_MAX_REL (127) /*!< The maximum value that we can move down on the y-axis */
-
-enum MOUSE_TYPE
-{
- ABS_MOUSE,
- REL_MOUSE,
-};
-
-/**
- *
- * USBMouse example
- * @code
- * #include "mbed.h"
- * #include "USBMouse.h"
- *
- * USBMouse mouse;
- *
- * int main(void)
- * {
- * while (1)
- * {
- * mouse.move(20, 0);
- * wait(0.5);
- * }
- * }
- *
- * @endcode
- *
- *
- * @code
- * #include "mbed.h"
- * #include "USBMouse.h"
- * #include <math.h>
- *
- * USBMouse mouse(ABS_MOUSE);
- *
- * int main(void)
- * {
- * uint16_t x_center = (X_MAX_ABS - X_MIN_ABS)/2;
- * uint16_t y_center = (Y_MAX_ABS - Y_MIN_ABS)/2;
- * uint16_t x_screen = 0;
- * uint16_t y_screen = 0;
- *
- * uint32_t x_origin = x_center;
- * uint32_t y_origin = y_center;
- * uint32_t radius = 5000;
- * uint32_t angle = 0;
- *
- * while (1)
- * {
- * x_screen = x_origin + cos((double)angle*3.14/180.0)*radius;
- * y_screen = y_origin + sin((double)angle*3.14/180.0)*radius;
- *
- * mouse.move(x_screen, y_screen);
- * angle += 3;
- * wait(0.01);
- * }
- * }
- *
- * @endcode
- */
-class USBMouse: public USBHID
-{
- public:
-
- /**
- * Constructor
- *
- * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)
- * @param vendor_id Your vendor_id (default: 0x1234)
- * @param product_id Your product_id (default: 0x0001)
- * @param product_release Your preoduct_release (default: 0x0001)
- *
- */
- USBMouse(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0001, uint16_t product_release = 0x0001):
- USBHID(0, 0, vendor_id, product_id, product_release, false)
- {
- button = 0;
- this->mouse_type = mouse_type;
- connect();
- };
-
- /**
- * Write a state of the mouse
- *
- * @param x x-axis position
- * @param y y-axis position
- * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)
- * @param z wheel state (>0 to scroll down, <0 to scroll up)
- * @returns true if there is no error, false otherwise
- */
- bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
-
-
- /**
- * Move the cursor to (x, y)
- *
- * @param x-axis position
- * @param y-axis position
- * @returns true if there is no error, false otherwise
- */
- bool move(int16_t x, int16_t y);
-
- /**
- * Press one or several buttons
- *
- * @param button button state (ex: press(MOUSE_LEFT))
- * @returns true if there is no error, false otherwise
- */
- bool press(uint8_t button);
-
- /**
- * Release one or several buttons
- *
- * @param button button state (ex: release(MOUSE_LEFT))
- * @returns true if there is no error, false otherwise
- */
- bool release(uint8_t button);
-
- /**
- * Double click (MOUSE_LEFT)
- *
- * @returns true if there is no error, false otherwise
- */
- bool doubleClick();
-
- /**
- * Click
- *
- * @param button state of the buttons ( ex: clic(MOUSE_LEFT))
- * @returns true if there is no error, false otherwise
- */
- bool click(uint8_t button);
-
- /**
- * Scrolling
- *
- * @param z value of the wheel (>0 to go down, <0 to go up)
- * @returns true if there is no error, false otherwise
- */
- bool scroll(int8_t z);
-
- /*
- * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
- *
- * @returns pointer to the report descriptor
- */
- virtual uint8_t * reportDesc();
-
- protected:
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
- private:
- MOUSE_TYPE mouse_type;
- uint8_t button;
- bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
-};
-
-#endif
--- a/Drivers/USBDevice/USBHID/USBMouseKeyboard.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,706 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBMouseKeyboard.h"
-
-typedef struct {
- unsigned char usage;
- unsigned char modifier;
-} KEYMAP;
-
-#ifdef US_KEYBOARD
-/* US keyboard (as HID standard) */
-#define KEYMAP_SIZE (152)
-const KEYMAP keymap[KEYMAP_SIZE] = {
- {0, 0}, /* NUL */
- {0, 0}, /* SOH */
- {0, 0}, /* STX */
- {0, 0}, /* ETX */
- {0, 0}, /* EOT */
- {0, 0}, /* ENQ */
- {0, 0}, /* ACK */
- {0, 0}, /* BEL */
- {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */
- {0x2b, 0}, /* TAB */ /* Keyboard Tab */
- {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */
- {0, 0}, /* VT */
- {0, 0}, /* FF */
- {0, 0}, /* CR */
- {0, 0}, /* SO */
- {0, 0}, /* SI */
- {0, 0}, /* DEL */
- {0, 0}, /* DC1 */
- {0, 0}, /* DC2 */
- {0, 0}, /* DC3 */
- {0, 0}, /* DC4 */
- {0, 0}, /* NAK */
- {0, 0}, /* SYN */
- {0, 0}, /* ETB */
- {0, 0}, /* CAN */
- {0, 0}, /* EM */
- {0, 0}, /* SUB */
- {0, 0}, /* ESC */
- {0, 0}, /* FS */
- {0, 0}, /* GS */
- {0, 0}, /* RS */
- {0, 0}, /* US */
- {0x2c, 0}, /* */
- {0x1e, KEY_SHIFT}, /* ! */
- {0x34, KEY_SHIFT}, /* " */
- {0x20, KEY_SHIFT}, /* # */
- {0x21, KEY_SHIFT}, /* $ */
- {0x22, KEY_SHIFT}, /* % */
- {0x24, KEY_SHIFT}, /* & */
- {0x34, 0}, /* ' */
- {0x26, KEY_SHIFT}, /* ( */
- {0x27, KEY_SHIFT}, /* ) */
- {0x25, KEY_SHIFT}, /* * */
- {0x2e, KEY_SHIFT}, /* + */
- {0x36, 0}, /* , */
- {0x2d, 0}, /* - */
- {0x37, 0}, /* . */
- {0x38, 0}, /* / */
- {0x27, 0}, /* 0 */
- {0x1e, 0}, /* 1 */
- {0x1f, 0}, /* 2 */
- {0x20, 0}, /* 3 */
- {0x21, 0}, /* 4 */
- {0x22, 0}, /* 5 */
- {0x23, 0}, /* 6 */
- {0x24, 0}, /* 7 */
- {0x25, 0}, /* 8 */
- {0x26, 0}, /* 9 */
- {0x33, KEY_SHIFT}, /* : */
- {0x33, 0}, /* ; */
- {0x36, KEY_SHIFT}, /* < */
- {0x2e, 0}, /* = */
- {0x37, KEY_SHIFT}, /* > */
- {0x38, KEY_SHIFT}, /* ? */
- {0x1f, KEY_SHIFT}, /* @ */
- {0x04, KEY_SHIFT}, /* A */
- {0x05, KEY_SHIFT}, /* B */
- {0x06, KEY_SHIFT}, /* C */
- {0x07, KEY_SHIFT}, /* D */
- {0x08, KEY_SHIFT}, /* E */
- {0x09, KEY_SHIFT}, /* F */
- {0x0a, KEY_SHIFT}, /* G */
- {0x0b, KEY_SHIFT}, /* H */
- {0x0c, KEY_SHIFT}, /* I */
- {0x0d, KEY_SHIFT}, /* J */
- {0x0e, KEY_SHIFT}, /* K */
- {0x0f, KEY_SHIFT}, /* L */
- {0x10, KEY_SHIFT}, /* M */
- {0x11, KEY_SHIFT}, /* N */
- {0x12, KEY_SHIFT}, /* O */
- {0x13, KEY_SHIFT}, /* P */
- {0x14, KEY_SHIFT}, /* Q */
- {0x15, KEY_SHIFT}, /* R */
- {0x16, KEY_SHIFT}, /* S */
- {0x17, KEY_SHIFT}, /* T */
- {0x18, KEY_SHIFT}, /* U */
- {0x19, KEY_SHIFT}, /* V */
- {0x1a, KEY_SHIFT}, /* W */
- {0x1b, KEY_SHIFT}, /* X */
- {0x1c, KEY_SHIFT}, /* Y */
- {0x1d, KEY_SHIFT}, /* Z */
- {0x2f, 0}, /* [ */
- {0x31, 0}, /* \ */
- {0x30, 0}, /* ] */
- {0x23, KEY_SHIFT}, /* ^ */
- {0x2d, KEY_SHIFT}, /* _ */
- {0x35, 0}, /* ` */
- {0x04, 0}, /* a */
- {0x05, 0}, /* b */
- {0x06, 0}, /* c */
- {0x07, 0}, /* d */
- {0x08, 0}, /* e */
- {0x09, 0}, /* f */
- {0x0a, 0}, /* g */
- {0x0b, 0}, /* h */
- {0x0c, 0}, /* i */
- {0x0d, 0}, /* j */
- {0x0e, 0}, /* k */
- {0x0f, 0}, /* l */
- {0x10, 0}, /* m */
- {0x11, 0}, /* n */
- {0x12, 0}, /* o */
- {0x13, 0}, /* p */
- {0x14, 0}, /* q */
- {0x15, 0}, /* r */
- {0x16, 0}, /* s */
- {0x17, 0}, /* t */
- {0x18, 0}, /* u */
- {0x19, 0}, /* v */
- {0x1a, 0}, /* w */
- {0x1b, 0}, /* x */
- {0x1c, 0}, /* y */
- {0x1d, 0}, /* z */
- {0x2f, KEY_SHIFT}, /* { */
- {0x31, KEY_SHIFT}, /* | */
- {0x30, KEY_SHIFT}, /* } */
- {0x35, KEY_SHIFT}, /* ~ */
- {0,0}, /* DEL */
-
- {0x3a, 0}, /* F1 */
- {0x3b, 0}, /* F2 */
- {0x3c, 0}, /* F3 */
- {0x3d, 0}, /* F4 */
- {0x3e, 0}, /* F5 */
- {0x3f, 0}, /* F6 */
- {0x40, 0}, /* F7 */
- {0x41, 0}, /* F8 */
- {0x42, 0}, /* F9 */
- {0x43, 0}, /* F10 */
- {0x44, 0}, /* F11 */
- {0x45, 0}, /* F12 */
-
- {0x46, 0}, /* PRINT_SCREEN */
- {0x47, 0}, /* SCROLL_LOCK */
- {0x39, 0}, /* CAPS_LOCK */
- {0x53, 0}, /* NUM_LOCK */
- {0x49, 0}, /* INSERT */
- {0x4a, 0}, /* HOME */
- {0x4b, 0}, /* PAGE_UP */
- {0x4e, 0}, /* PAGE_DOWN */
-
- {0x4f, 0}, /* RIGHT_ARROW */
- {0x50, 0}, /* LEFT_ARROW */
- {0x51, 0}, /* DOWN_ARROW */
- {0x52, 0}, /* UP_ARROW */
-};
-
-#else
-/* UK keyboard */
-#define KEYMAP_SIZE (152)
-const KEYMAP keymap[KEYMAP_SIZE] = {
- {0, 0}, /* NUL */
- {0, 0}, /* SOH */
- {0, 0}, /* STX */
- {0, 0}, /* ETX */
- {0, 0}, /* EOT */
- {0, 0}, /* ENQ */
- {0, 0}, /* ACK */
- {0, 0}, /* BEL */
- {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */
- {0x2b, 0}, /* TAB */ /* Keyboard Tab */
- {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */
- {0, 0}, /* VT */
- {0, 0}, /* FF */
- {0, 0}, /* CR */
- {0, 0}, /* SO */
- {0, 0}, /* SI */
- {0, 0}, /* DEL */
- {0, 0}, /* DC1 */
- {0, 0}, /* DC2 */
- {0, 0}, /* DC3 */
- {0, 0}, /* DC4 */
- {0, 0}, /* NAK */
- {0, 0}, /* SYN */
- {0, 0}, /* ETB */
- {0, 0}, /* CAN */
- {0, 0}, /* EM */
- {0, 0}, /* SUB */
- {0, 0}, /* ESC */
- {0, 0}, /* FS */
- {0, 0}, /* GS */
- {0, 0}, /* RS */
- {0, 0}, /* US */
- {0x2c, 0}, /* */
- {0x1e, KEY_SHIFT}, /* ! */
- {0x1f, KEY_SHIFT}, /* " */
- {0x32, 0}, /* # */
- {0x21, KEY_SHIFT}, /* $ */
- {0x22, KEY_SHIFT}, /* % */
- {0x24, KEY_SHIFT}, /* & */
- {0x34, 0}, /* ' */
- {0x26, KEY_SHIFT}, /* ( */
- {0x27, KEY_SHIFT}, /* ) */
- {0x25, KEY_SHIFT}, /* * */
- {0x2e, KEY_SHIFT}, /* + */
- {0x36, 0}, /* , */
- {0x2d, 0}, /* - */
- {0x37, 0}, /* . */
- {0x38, 0}, /* / */
- {0x27, 0}, /* 0 */
- {0x1e, 0}, /* 1 */
- {0x1f, 0}, /* 2 */
- {0x20, 0}, /* 3 */
- {0x21, 0}, /* 4 */
- {0x22, 0}, /* 5 */
- {0x23, 0}, /* 6 */
- {0x24, 0}, /* 7 */
- {0x25, 0}, /* 8 */
- {0x26, 0}, /* 9 */
- {0x33, KEY_SHIFT}, /* : */
- {0x33, 0}, /* ; */
- {0x36, KEY_SHIFT}, /* < */
- {0x2e, 0}, /* = */
- {0x37, KEY_SHIFT}, /* > */
- {0x38, KEY_SHIFT}, /* ? */
- {0x34, KEY_SHIFT}, /* @ */
- {0x04, KEY_SHIFT}, /* A */
- {0x05, KEY_SHIFT}, /* B */
- {0x06, KEY_SHIFT}, /* C */
- {0x07, KEY_SHIFT}, /* D */
- {0x08, KEY_SHIFT}, /* E */
- {0x09, KEY_SHIFT}, /* F */
- {0x0a, KEY_SHIFT}, /* G */
- {0x0b, KEY_SHIFT}, /* H */
- {0x0c, KEY_SHIFT}, /* I */
- {0x0d, KEY_SHIFT}, /* J */
- {0x0e, KEY_SHIFT}, /* K */
- {0x0f, KEY_SHIFT}, /* L */
- {0x10, KEY_SHIFT}, /* M */
- {0x11, KEY_SHIFT}, /* N */
- {0x12, KEY_SHIFT}, /* O */
- {0x13, KEY_SHIFT}, /* P */
- {0x14, KEY_SHIFT}, /* Q */
- {0x15, KEY_SHIFT}, /* R */
- {0x16, KEY_SHIFT}, /* S */
- {0x17, KEY_SHIFT}, /* T */
- {0x18, KEY_SHIFT}, /* U */
- {0x19, KEY_SHIFT}, /* V */
- {0x1a, KEY_SHIFT}, /* W */
- {0x1b, KEY_SHIFT}, /* X */
- {0x1c, KEY_SHIFT}, /* Y */
- {0x1d, KEY_SHIFT}, /* Z */
- {0x2f, 0}, /* [ */
- {0x64, 0}, /* \ */
- {0x30, 0}, /* ] */
- {0x23, KEY_SHIFT}, /* ^ */
- {0x2d, KEY_SHIFT}, /* _ */
- {0x35, 0}, /* ` */
- {0x04, 0}, /* a */
- {0x05, 0}, /* b */
- {0x06, 0}, /* c */
- {0x07, 0}, /* d */
- {0x08, 0}, /* e */
- {0x09, 0}, /* f */
- {0x0a, 0}, /* g */
- {0x0b, 0}, /* h */
- {0x0c, 0}, /* i */
- {0x0d, 0}, /* j */
- {0x0e, 0}, /* k */
- {0x0f, 0}, /* l */
- {0x10, 0}, /* m */
- {0x11, 0}, /* n */
- {0x12, 0}, /* o */
- {0x13, 0}, /* p */
- {0x14, 0}, /* q */
- {0x15, 0}, /* r */
- {0x16, 0}, /* s */
- {0x17, 0}, /* t */
- {0x18, 0}, /* u */
- {0x19, 0}, /* v */
- {0x1a, 0}, /* w */
- {0x1b, 0}, /* x */
- {0x1c, 0}, /* y */
- {0x1d, 0}, /* z */
- {0x2f, KEY_SHIFT}, /* { */
- {0x64, KEY_SHIFT}, /* | */
- {0x30, KEY_SHIFT}, /* } */
- {0x32, KEY_SHIFT}, /* ~ */
- {0,0}, /* DEL */
-
- {0x3a, 0}, /* F1 */
- {0x3b, 0}, /* F2 */
- {0x3c, 0}, /* F3 */
- {0x3d, 0}, /* F4 */
- {0x3e, 0}, /* F5 */
- {0x3f, 0}, /* F6 */
- {0x40, 0}, /* F7 */
- {0x41, 0}, /* F8 */
- {0x42, 0}, /* F9 */
- {0x43, 0}, /* F10 */
- {0x44, 0}, /* F11 */
- {0x45, 0}, /* F12 */
-
- {0x46, 0}, /* PRINT_SCREEN */
- {0x47, 0}, /* SCROLL_LOCK */
- {0x39, 0}, /* CAPS_LOCK */
- {0x53, 0}, /* NUM_LOCK */
- {0x49, 0}, /* INSERT */
- {0x4a, 0}, /* HOME */
- {0x4b, 0}, /* PAGE_UP */
- {0x4e, 0}, /* PAGE_DOWN */
-
- {0x4f, 0}, /* RIGHT_ARROW */
- {0x50, 0}, /* LEFT_ARROW */
- {0x51, 0}, /* DOWN_ARROW */
- {0x52, 0}, /* UP_ARROW */
-};
-#endif
-
-
-uint8_t * USBMouseKeyboard::reportDesc() {
- if (mouse_type == REL_MOUSE) {
- static uint8_t reportDescriptor[] = {
- // Keyboard
- USAGE_PAGE(1), 0x01,
- USAGE(1), 0x06,
- COLLECTION(1), 0x01,
- REPORT_ID(1), REPORT_ID_KEYBOARD,
- USAGE_PAGE(1), 0x07,
- USAGE_MINIMUM(1), 0xE0,
- USAGE_MAXIMUM(1), 0xE7,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- REPORT_SIZE(1), 0x01,
- REPORT_COUNT(1), 0x08,
- INPUT(1), 0x02,
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x08,
- INPUT(1), 0x01,
- REPORT_COUNT(1), 0x05,
- REPORT_SIZE(1), 0x01,
- USAGE_PAGE(1), 0x08,
- USAGE_MINIMUM(1), 0x01,
- USAGE_MAXIMUM(1), 0x05,
- OUTPUT(1), 0x02,
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x03,
- OUTPUT(1), 0x01,
- REPORT_COUNT(1), 0x06,
- REPORT_SIZE(1), 0x08,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(2), 0xff, 0x00,
- USAGE_PAGE(1), 0x07,
- USAGE_MINIMUM(1), 0x00,
- USAGE_MAXIMUM(2), 0xff, 0x00,
- INPUT(1), 0x00,
- END_COLLECTION(0),
-
- // Mouse
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x02, // Mouse
- COLLECTION(1), 0x01, // Application
- USAGE(1), 0x01, // Pointer
- COLLECTION(1), 0x00, // Physical
- REPORT_ID(1), REPORT_ID_MOUSE,
- REPORT_COUNT(1), 0x03,
- REPORT_SIZE(1), 0x01,
- USAGE_PAGE(1), 0x09, // Buttons
- USAGE_MINIMUM(1), 0x1,
- USAGE_MAXIMUM(1), 0x3,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- INPUT(1), 0x02,
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x05,
- INPUT(1), 0x01,
- REPORT_COUNT(1), 0x03,
- REPORT_SIZE(1), 0x08,
- USAGE_PAGE(1), 0x01,
- USAGE(1), 0x30, // X
- USAGE(1), 0x31, // Y
- USAGE(1), 0x38, // scroll
- LOGICAL_MINIMUM(1), 0x81,
- LOGICAL_MAXIMUM(1), 0x7f,
- INPUT(1), 0x06,
- END_COLLECTION(0),
- END_COLLECTION(0),
-
-
- // Media Control
- USAGE_PAGE(1), 0x0C,
- USAGE(1), 0x01,
- COLLECTION(1), 0x01,
- REPORT_ID(1), REPORT_ID_VOLUME,
- USAGE_PAGE(1), 0x0C,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- REPORT_SIZE(1), 0x01,
- REPORT_COUNT(1), 0x07,
- USAGE(1), 0xB5, // Next Track
- USAGE(1), 0xB6, // Previous Track
- USAGE(1), 0xB7, // Stop
- USAGE(1), 0xCD, // Play / Pause
- USAGE(1), 0xE2, // Mute
- USAGE(1), 0xE9, // Volume Up
- USAGE(1), 0xEA, // Volume Down
- INPUT(1), 0x02, // Input (Data, Variable, Absolute)
- REPORT_COUNT(1), 0x01,
- INPUT(1), 0x01,
- END_COLLECTION(0),
- };
- reportLength = sizeof(reportDescriptor);
- return reportDescriptor;
- } else if (mouse_type == ABS_MOUSE) {
- static uint8_t reportDescriptor[] = {
-
- // Keyboard
- USAGE_PAGE(1), 0x01,
- USAGE(1), 0x06,
- COLLECTION(1), 0x01,
- REPORT_ID(1), REPORT_ID_KEYBOARD,
- USAGE_PAGE(1), 0x07,
- USAGE_MINIMUM(1), 0xE0,
- USAGE_MAXIMUM(1), 0xE7,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- REPORT_SIZE(1), 0x01,
- REPORT_COUNT(1), 0x08,
- INPUT(1), 0x02,
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x08,
- INPUT(1), 0x01,
- REPORT_COUNT(1), 0x05,
- REPORT_SIZE(1), 0x01,
- USAGE_PAGE(1), 0x08,
- USAGE_MINIMUM(1), 0x01,
- USAGE_MAXIMUM(1), 0x05,
- OUTPUT(1), 0x02,
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x03,
- OUTPUT(1), 0x01,
- REPORT_COUNT(1), 0x06,
- REPORT_SIZE(1), 0x08,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(2), 0xff, 0x00,
- USAGE_PAGE(1), 0x07,
- USAGE_MINIMUM(1), 0x00,
- USAGE_MAXIMUM(2), 0xff, 0x00,
- INPUT(1), 0x00,
- END_COLLECTION(0),
-
- // Mouse
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x02, // Mouse
- COLLECTION(1), 0x01, // Application
- USAGE(1), 0x01, // Pointer
- COLLECTION(1), 0x00, // Physical
- REPORT_ID(1), REPORT_ID_MOUSE,
-
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x30, // X
- USAGE(1), 0x31, // Y
- LOGICAL_MINIMUM(1), 0x00, // 0
- LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767
- REPORT_SIZE(1), 0x10,
- REPORT_COUNT(1), 0x02,
- INPUT(1), 0x02, // Data, Variable, Absolute
-
- USAGE_PAGE(1), 0x01, // Generic Desktop
- USAGE(1), 0x38, // scroll
- LOGICAL_MINIMUM(1), 0x81, // -127
- LOGICAL_MAXIMUM(1), 0x7f, // 127
- REPORT_SIZE(1), 0x08,
- REPORT_COUNT(1), 0x01,
- INPUT(1), 0x06, // Data, Variable, Relative
-
- USAGE_PAGE(1), 0x09, // Buttons
- USAGE_MINIMUM(1), 0x01,
- USAGE_MAXIMUM(1), 0x03,
- LOGICAL_MINIMUM(1), 0x00, // 0
- LOGICAL_MAXIMUM(1), 0x01, // 1
- REPORT_COUNT(1), 0x03,
- REPORT_SIZE(1), 0x01,
- INPUT(1), 0x02, // Data, Variable, Absolute
- REPORT_COUNT(1), 0x01,
- REPORT_SIZE(1), 0x05,
- INPUT(1), 0x01, // Constant
-
- END_COLLECTION(0),
- END_COLLECTION(0),
-
- // Media Control
- USAGE_PAGE(1), 0x0C,
- USAGE(1), 0x01,
- COLLECTION(1), 0x01,
- REPORT_ID(1), REPORT_ID_VOLUME,
- USAGE_PAGE(1), 0x0C,
- LOGICAL_MINIMUM(1), 0x00,
- LOGICAL_MAXIMUM(1), 0x01,
- REPORT_SIZE(1), 0x01,
- REPORT_COUNT(1), 0x07,
- USAGE(1), 0xB5, // Next Track
- USAGE(1), 0xB6, // Previous Track
- USAGE(1), 0xB7, // Stop
- USAGE(1), 0xCD, // Play / Pause
- USAGE(1), 0xE2, // Mute
- USAGE(1), 0xE9, // Volume Up
- USAGE(1), 0xEA, // Volume Down
- INPUT(1), 0x02, // Input (Data, Variable, Absolute)
- REPORT_COUNT(1), 0x01,
- INPUT(1), 0x01,
- END_COLLECTION(0),
- };
- reportLength = sizeof(reportDescriptor);
- return reportDescriptor;
- }
-
- return NULL;
-}
-
-bool USBMouseKeyboard::EPINT_OUT_callback() {
- uint32_t bytesRead = 0;
- uint8_t led[65];
- USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
-
- // we take led[1] because led[0] is the report ID
- lock_status = led[1] & 0x07;
-
- // We activate the endpoint to be able to recceive data
- if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
- return false;
- return true;
-}
-
-uint8_t USBMouseKeyboard::lockStatus() {
- return lock_status;
-}
-
-bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {
- switch (mouse_type) {
- case REL_MOUSE:
- while (x > 127) {
- if (!mouseSend(127, 0, button, z)) return false;
- x = x - 127;
- }
- while (x < -128) {
- if (!mouseSend(-128, 0, button, z)) return false;
- x = x + 128;
- }
- while (y > 127) {
- if (!mouseSend(0, 127, button, z)) return false;
- y = y - 127;
- }
- while (y < -128) {
- if (!mouseSend(0, -128, button, z)) return false;
- y = y + 128;
- }
- return mouseSend(x, y, button, z);
- case ABS_MOUSE:
- HID_REPORT report;
-
- report.data[0] = REPORT_ID_MOUSE;
- report.data[1] = x & 0xff;
- report.data[2] = (x >> 8) & 0xff;
- report.data[3] = y & 0xff;
- report.data[4] = (y >> 8) & 0xff;
- report.data[5] = -z;
- report.data[6] = button & 0x07;
-
- report.length = 7;
-
- return send(&report);
- default:
- return false;
- }
-}
-
-bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {
- HID_REPORT report;
- report.data[0] = REPORT_ID_MOUSE;
- report.data[1] = buttons & 0x07;
- report.data[2] = x;
- report.data[3] = y;
- report.data[4] = -z; // >0 to scroll down, <0 to scroll up
-
- report.length = 5;
-
- return send(&report);
-}
-
-bool USBMouseKeyboard::move(int16_t x, int16_t y) {
- return update(x, y, button, 0);
-}
-
-bool USBMouseKeyboard::scroll(int8_t z) {
- return update(0, 0, button, z);
-}
-
-bool USBMouseKeyboard::doubleClick() {
- if (!click(MOUSE_LEFT))
- return false;
- wait(0.1);
- return click(MOUSE_LEFT);
-}
-
-bool USBMouseKeyboard::click(uint8_t button) {
- if (!update(0, 0, button, 0))
- return false;
- wait(0.01);
- return update(0, 0, 0, 0);
-}
-
-bool USBMouseKeyboard::press(uint8_t button_) {
- button = button_ & 0x07;
- return update(0, 0, button, 0);
-}
-
-bool USBMouseKeyboard::release(uint8_t button_) {
- button = (button & (~button_)) & 0x07;
- return update(0, 0, button, 0);
-}
-
-int USBMouseKeyboard::_putc(int c) {
- return keyCode(c, keymap[c].modifier);
-}
-
-bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) {
- // Send a simulated keyboard keypress. Returns true if successful.
-
- HID_REPORT report;
-
- report.data[0] = REPORT_ID_KEYBOARD;
- report.data[1] = modifier;
- report.data[2] = 0;
- report.data[3] = keymap[key].usage;
- report.data[4] = 0;
- report.data[5] = 0;
- report.data[6] = 0;
- report.data[7] = 0;
- report.data[8] = 0;
-
- report.length = 9;
-
- if (!send(&report)) {
- return false;
- }
-
- report.data[1] = 0;
- report.data[3] = 0;
-
- if (!send(&report)) {
- return false;
- }
-
- return true;
-
-}
-
-
-bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
- HID_REPORT report;
-
- report.data[0] = REPORT_ID_VOLUME;
- report.data[1] = (1 << key) & 0x7f;
-
- report.length = 2;
-
- send(&report);
-
- report.data[0] = REPORT_ID_VOLUME;
- report.data[1] = 0;
-
- report.length = 2;
-
- return send(&report);
-}
--- a/Drivers/USBDevice/USBHID/USBMouseKeyboard.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBMOUSEKEYBOARD_H
-#define USBMOUSEKEYBOARD_H
-
-#define REPORT_ID_KEYBOARD 1
-#define REPORT_ID_MOUSE 2
-#define REPORT_ID_VOLUME 3
-
-#include "USBMouse.h"
-#include "USBKeyboard.h"
-#include "Stream.h"
-#include "USBHID.h"
-
-/**
- * USBMouseKeyboard example
- * @code
- *
- * #include "mbed.h"
- * #include "USBMouseKeyboard.h"
- *
- * USBMouseKeyboard key_mouse;
- *
- * int main(void)
- * {
- * while(1)
- * {
- * key_mouse.move(20, 0);
- * key_mouse.printf("Hello From MBED\r\n");
- * wait(1);
- * }
- * }
- * @endcode
- *
- *
- * @code
- *
- * #include "mbed.h"
- * #include "USBMouseKeyboard.h"
- *
- * USBMouseKeyboard key_mouse(ABS_MOUSE);
- *
- * int main(void)
- * {
- * while(1)
- * {
- * key_mouse.move(X_MAX_ABS/2, Y_MAX_ABS/2);
- * key_mouse.printf("Hello from MBED\r\n");
- * wait(1);
- * }
- * }
- * @endcode
- */
-class USBMouseKeyboard: public USBHID, public Stream
-{
- public:
-
- /**
- * Constructor
- *
- * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)
- * @param leds Leds bus: first: NUM_LOCK, second: CAPS_LOCK, third: SCROLL_LOCK
- * @param vendor_id Your vendor_id (default: 0x1234)
- * @param product_id Your product_id (default: 0x0001)
- * @param product_release Your preoduct_release (default: 0x0001)
- *
- */
- USBMouseKeyboard(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x0021, uint16_t product_id = 0x0011, uint16_t product_release = 0x0001):
- USBHID(0, 0, vendor_id, product_id, product_release, false)
- {
- lock_status = 0;
- button = 0;
- this->mouse_type = mouse_type;
- connect();
- };
-
- /**
- * Write a state of the mouse
- *
- * @param x x-axis position
- * @param y y-axis position
- * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)
- * @param z wheel state (>0 to scroll down, <0 to scroll up)
- * @returns true if there is no error, false otherwise
- */
- bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
-
-
- /**
- * Move the cursor to (x, y)
- *
- * @param x x-axis position
- * @param y y-axis position
- * @returns true if there is no error, false otherwise
- */
- bool move(int16_t x, int16_t y);
-
- /**
- * Press one or several buttons
- *
- * @param button button state (ex: press(MOUSE_LEFT))
- * @returns true if there is no error, false otherwise
- */
- bool press(uint8_t button);
-
- /**
- * Release one or several buttons
- *
- * @param button button state (ex: release(MOUSE_LEFT))
- * @returns true if there is no error, false otherwise
- */
- bool release(uint8_t button);
-
- /**
- * Double click (MOUSE_LEFT)
- *
- * @returns true if there is no error, false otherwise
- */
- bool doubleClick();
-
- /**
- * Click
- *
- * @param button state of the buttons ( ex: clic(MOUSE_LEFT))
- * @returns true if there is no error, false otherwise
- */
- bool click(uint8_t button);
-
- /**
- * Scrolling
- *
- * @param z value of the wheel (>0 to go down, <0 to go up)
- * @returns true if there is no error, false otherwise
- */
- bool scroll(int8_t z);
-
- /**
- * To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key
- *
- * @code
- * //To send CTRL + s (save)
- * keyboard.keyCode('s', KEY_CTRL);
- * @endcode
- *
- * @param modifier bit 0: KEY_CTRL, bit 1: KEY_SHIFT, bit 2: KEY_ALT (default: 0)
- * @param key character to send
- * @returns true if there is no error, false otherwise
- */
- bool keyCode(uint8_t key, uint8_t modifier = 0);
-
- /**
- * Send a character
- *
- * @param c character to be sent
- * @returns true if there is no error, false otherwise
- */
- virtual int _putc(int c);
-
- /**
- * Control media keys
- *
- * @param key media key pressed (KEY_NEXT_TRACK, KEY_PREVIOUS_TRACK, KEY_STOP, KEY_PLAY_PAUSE, KEY_MUTE, KEY_VOLUME_UP, KEY_VOLUME_DOWN)
- * @returns true if there is no error, false otherwise
- */
- bool mediaControl(MEDIA_KEY key);
-
- /**
- * Read status of lock keys. Useful to switch-on/off leds according to key pressed. Only the first three bits of the result is important:
- * - First bit: NUM_LOCK
- * - Second bit: CAPS_LOCK
- * - Third bit: SCROLL_LOCK
- *
- * @returns status of lock keys
- */
- uint8_t lockStatus();
-
- /*
- * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
- *
- * @returns pointer to the report descriptor
- */
- virtual uint8_t * reportDesc();
-
- /*
- * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
- *
- * @returns if handle by subclass, return true
- */
- virtual bool EPINT_OUT_callback();
-
-
- private:
- bool mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z);
- MOUSE_TYPE mouse_type;
- uint8_t button;
- bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
-
- uint8_t lock_status;
-
- //dummy otherwise it doesn't compile (we must define all methods of an abstract class)
- virtual int _getc() { return -1;}
-};
-
-#endif
--- a/Drivers/USBDevice/USBMIDI/MIDIMessage.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef MIDIMESSAGE_H
-#define MIDIMESSAGE_H
-
-#include "mbed.h"
-
-#define MAX_MIDI_MESSAGE_SIZE 256 // Max message size. SysEx can be up to 65536 but 256 should be fine for most usage
-
-// MIDI Message Format
-//
-// [ msg(4) | channel(4) ] [ 0 | n(7) ] [ 0 | m(7) ]
-//
-// MIDI Data Messages (Channel Specific)
-//
-// Message msg n m
-// ---------------------------------------------
-// Note Off 0x8 Key Velocity
-// Note On 0x9 Key Velocity
-// Polyphonic Aftertouch 0xA Key Pressure
-// Control Change 0xB Controller Value
-// Program Change 0xC Program -
-// Channel Aftertouch 0xD Pressure -
-// Pitch Wheel 0xE LSB MSB
-
-#define CABLE_NUM (0<<4)
-
-/** A MIDI message container */
-class MIDIMessage {
-public:
- MIDIMessage() : length(4) {}
-
- MIDIMessage(uint8_t *buf) : length(4) {
- for (int i = 0; i < 4; i++)
- data[i] = buf[i];
- }
-
- // New constructor, buf is a true MIDI message (not USBMidi message) and buf_len true message length.
- MIDIMessage(uint8_t *buf, int buf_len) {
- length=buf_len+1;
- // first byte keeped for retro-compatibility
- data[0]=0;
-
- for (int i = 0; i < buf_len; i++)
- data[i+1] = buf[i];
- }
-
- // create messages
-
- /** Create a NoteOff message
- * @param key Key ID
- * @param velocity Key velocity (0-127, default = 127)
- * @param channel Key channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage NoteOff(int key, int velocity = 127, int channel = 0) {
- MIDIMessage msg;
- msg.data[0] = CABLE_NUM | 0x08;
- msg.data[1] = 0x80 | (channel & 0x0F);
- msg.data[2] = key & 0x7F;
- msg.data[3] = velocity & 0x7F;
- return msg;
- }
-
- /** Create a NoteOn message
- * @param key Key ID
- * @param velocity Key velocity (0-127, default = 127)
- * @param channel Key channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage NoteOn(int key, int velocity = 127, int channel = 0) {
- MIDIMessage msg;
- msg.data[0] = CABLE_NUM | 0x09;
- msg.data[1] = 0x90 | (channel & 0x0F);
- msg.data[2] = key & 0x7F;
- msg.data[3] = velocity & 0x7F;
- return msg;
- }
-
- /** Create a PolyPhonic Aftertouch message
- * @param key Key ID
- * @param pressure Aftertouch pressure (0-127)
- * @param channel Key channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage PolyphonicAftertouch(int key, int pressure, int channel = 0) {
- MIDIMessage msg;
- msg.data[0] = CABLE_NUM | 0x0A;
- msg.data[1] = 0xA0 | (channel & 0x0F);
- msg.data[2] = key & 0x7F;
- msg.data[3] = pressure & 0x7F;
- return msg;
- }
-
- /** Create a Control Change message
- * @param control Controller ID
- * @param value Controller value (0-127)
- * @param channel Controller channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage ControlChange(int control, int value, int channel = 0) {
- MIDIMessage msg;
- msg.data[0] = CABLE_NUM | 0x0B;
- msg.data[1] = 0xB0 | (channel & 0x0F);
- msg.data[2] = control & 0x7F;
- msg.data[3] = value & 0x7F;
- return msg;
- }
-
- /** Create a Program Change message
- * @param program Program ID
- * @param channel Channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage ProgramChange(int program, int channel = 0) {
- MIDIMessage msg;
- msg.data[0] = CABLE_NUM | 0x0C;
- msg.data[1] = 0xC0 | (channel & 0x0F);
- msg.data[2] = program & 0x7F;
- msg.data[3] = 0x00;
- return msg;
- }
-
- /** Create a Channel Aftertouch message
- * @param pressure Pressure
- * @param channel Key channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage ChannelAftertouch(int pressure, int channel = 0) {
- MIDIMessage msg;
- msg.data[0] = CABLE_NUM | 0x0D;
- msg.data[1] = 0xD0 | (channel & 0x0F);
- msg.data[2] = pressure & 0x7F;
- msg.data[3] = 0x00;
- return msg;
- }
-
- /** Create a Pitch Wheel message
- * @param pitch Pitch (-8192 - 8191, default = 0)
- * @param channel Channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage PitchWheel(int pitch = 0, int channel = 0) {
- MIDIMessage msg;
- int p = pitch + 8192; // 0 - 16383, 8192 is center
- msg.data[0] = CABLE_NUM | 0x0E;
- msg.data[1] = 0xE0 | (channel & 0x0F);
- msg.data[2] = p & 0x7F;
- msg.data[3] = (p >> 7) & 0x7F;
- return msg;
- }
-
- /** Create an All Notes Off message
- * @param channel Channel (0-15, default 0)
- * @returns A MIDIMessage
- */
- static MIDIMessage AllNotesOff(int channel = 0) {
- return ControlChange(123, 0, channel);
- }
-
- /** Create a SysEx message
- * @param data SysEx data (including 0xF0 .. 0xF7)
- * @param len SysEx data length
- * @returns A MIDIMessage
- */
- static MIDIMessage SysEx(uint8_t *data, int len) {
- MIDIMessage msg=MIDIMessage(data,len);
- return msg;
- }
-
- // decode messages
-
- /** MIDI Message Types */
- enum MIDIMessageType {
- ErrorType,
- NoteOffType,
- NoteOnType,
- PolyphonicAftertouchType,
- ControlChangeType,
- ProgramChangeType,
- ChannelAftertouchType,
- PitchWheelType,
- AllNotesOffType,
- SysExType
- };
-
- /** Read the message type
- * @returns MIDIMessageType
- */
- MIDIMessageType type() {
- switch((data[1] >> 4) & 0xF) {
- case 0x8: return NoteOffType;
- case 0x9: return NoteOnType;
- case 0xA: return PolyphonicAftertouchType;
- case 0xB:
- if(controller() < 120) { // standard controllers
- return ControlChangeType;
- } else if(controller() == 123) {
- return AllNotesOffType;
- } else {
- return ErrorType; // unsupported atm
- }
- case 0xC: return ProgramChangeType;
- case 0xD: return ChannelAftertouchType;
- case 0xE: return PitchWheelType;
- case 0xF: return SysExType;
- default: return ErrorType;
- }
- }
-
- /** Read the channel number */
- int channel() {
- return (data[1] & 0x0F);
- }
-
- /** Read the key ID */
- int key() {
- return (data[2] & 0x7F);
- }
-
- /** Read the velocity */
- int velocity() {
- return (data[3] & 0x7F);
- }
-
- /** Read the controller value */
- int value() {
- return (data[3] & 0x7F);
- }
-
- /** Read the aftertouch pressure */
- int pressure() {
- if(type() == PolyphonicAftertouchType) {
- return (data[3] & 0x7F);
- } else {
- return (data[2] & 0x7F);
- }
- }
-
- /** Read the controller number */
- int controller() {
- return (data[2] & 0x7F);
- }
-
- /** Read the program number */
- int program() {
- return (data[2] & 0x7F);
- }
-
- /** Read the pitch value */
- int pitch() {
- int p = ((data[3] & 0x7F) << 7) | (data[2] & 0x7F);
- return p - 8192; // 0 - 16383, 8192 is center
- }
-
- uint8_t data[MAX_MIDI_MESSAGE_SIZE+1];
- uint8_t length;
-};
-
-#endif
--- a/Drivers/USBDevice/USBMIDI/USBMIDI.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBMIDI.h"
-
-
-USBMIDI::USBMIDI(uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
- : USBDevice(vendor_id, product_id, product_release), cur_data(0), data_end(true)
-{
- midi_evt = NULL;
- USBDevice::connect();
-}
-
-// write plain MIDIMessage that will be converted to USBMidi event packet
-void USBMIDI::write(MIDIMessage m) {
- // first byte keeped for retro-compatibility
- for(int p=1; p < m.length; p+=3) {
- uint8_t buf[4];
- // Midi message to USBMidi event packet
- buf[0]=m.data[1] >> 4;
- // SysEx
- if(buf[0] == 0xF) {
- if((m.length - p) > 3) {
- // SysEx start or continue
- buf[0]=0x4;
- } else {
- switch(m.length - p) {
- case 1:
- // SysEx end with one byte
- buf[0]=0x5;
- break;
- case 2:
- // SysEx end with two bytes
- buf[0]=0x6;
- break;
- case 3:
- // SysEx end with three bytes
- buf[0]=0x7;
- break;
- }
- }
- }
- buf[1]=m.data[p];
-
- if(p+1 < m.length)
- buf[2]=m.data[p+1];
- else
- buf[2]=0;
-
- if(p+2 < m.length)
- buf[3]=m.data[p+2];
- else
- buf[3]=0;
-
- USBDevice::write(EPBULK_IN, buf, 4, MAX_PACKET_SIZE_EPBULK);
- }
-}
-
-
-void USBMIDI::attach(void (*fptr)(MIDIMessage)) {
- midi_evt = fptr;
-}
-
-bool USBMIDI::EPBULK_OUT_callback() {
- uint8_t buf[64];
- uint32_t len;
- readEP(EPBULK_OUT, buf, &len, 64);
-
- if (midi_evt != NULL) {
- for (uint32_t i=0; i<len; i+=4) {
- uint8_t data_read;
- data_end=true;
- switch(buf[i]) {
- case 0x2:
- // Two-bytes System Common Message - undefined in USBMidi 1.0
- data_read=2;
- break;
- case 0x4:
- // SysEx start or continue
- data_end=false;
- data_read=3;
- break;
- case 0x5:
- // Single-byte System Common Message or SysEx end with one byte
- data_read=1;
- break;
- case 0x6:
- // SysEx end with two bytes
- data_read=2;
- break;
- case 0xC:
- // Program change
- data_read=2;
- break;
- case 0xD:
- // Channel pressure
- data_read=2;
- break;
- case 0xF:
- // Single byte
- data_read=1;
- break;
- default:
- // Others three-bytes messages
- data_read=3;
- break;
- }
-
- for(uint8_t j=1;j<data_read+1;j++) {
- data[cur_data]=buf[i+j];
- cur_data++;
- }
-
- if(data_end) {
- midi_evt(MIDIMessage(data,cur_data));
- cur_data=0;
- }
- }
- }
-
- // We reactivate the endpoint to receive next characters
- readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
- return true;
-}
-
-// Called in ISR context
-// Set configuration. Return false if the
-// configuration is not supported.
-bool USBMIDI::USBCallback_setConfiguration(uint8_t configuration) {
- if (configuration != DEFAULT_CONFIGURATION) {
- return false;
- }
-
- // Configure endpoints > 0
- addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
- addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
-
- // We activate the endpoint to be able to receive data
- readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
- return true;
-}
-
-
-uint8_t * USBMIDI::stringIinterfaceDesc() {
- static uint8_t stringIinterfaceDescriptor[] = {
- 0x0c, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'A',0,'u',0,'d',0,'i',0,'o',0 //bString iInterface - Audio
- };
- return stringIinterfaceDescriptor;
-}
-
-uint8_t * USBMIDI::stringIproductDesc() {
- static uint8_t stringIproductDescriptor[] = {
- 0x16, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
- };
- return stringIproductDescriptor;
-}
-
-
-uint8_t * USBMIDI::configurationDesc() {
- static uint8_t configDescriptor[] = {
- // configuration descriptor
- 0x09, 0x02, 0x65, 0x00, 0x02, 0x01, 0x00, 0xc0, 0x50,
-
- // The Audio Interface Collection
- 0x09, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, // Standard AC Interface Descriptor
- 0x09, 0x24, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, // Class-specific AC Interface Descriptor
- 0x09, 0x04, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, // MIDIStreaming Interface Descriptors
- 0x07, 0x24, 0x01, 0x00, 0x01, 0x41, 0x00, // Class-Specific MS Interface Header Descriptor
-
- // MIDI IN JACKS
- 0x06, 0x24, 0x02, 0x01, 0x01, 0x00,
- 0x06, 0x24, 0x02, 0x02, 0x02, 0x00,
-
- // MIDI OUT JACKS
- 0x09, 0x24, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x00,
- 0x09, 0x24, 0x03, 0x02, 0x06, 0x01, 0x01, 0x01, 0x00,
-
- // OUT endpoint descriptor
- 0x09, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,
- 0x05, 0x25, 0x01, 0x01, 0x01,
-
- // IN endpoint descriptor
- 0x09, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,
- 0x05, 0x25, 0x01, 0x01, 0x03,
- };
- return configDescriptor;
-}
--- a/Drivers/USBDevice/USBMIDI/USBMIDI.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBMIDI_H
-#define USBMIDI_H
-
-/* These headers are included for child class. */
-#include "USBEndpoints.h"
-#include "USBDescriptor.h"
-#include "USBDevice_Types.h"
-
-#include "USBDevice.h"
-#include "MIDIMessage.h"
-
-#define DEFAULT_CONFIGURATION (1)
-
-/**
-* USBMIDI example
-*
-* @code
-* #include "mbed.h"
-* #include "USBMIDI.h"
-*
-* USBMIDI midi;
-*
-* int main() {
-* while (1) {
-* for(int i=48; i<83; i++) { // send some messages!
-* midi.write(MIDIMessage::NoteOn(i));
-* wait(0.25);
-* midi.write(MIDIMessage::NoteOff(i));
-* wait(0.5);
-* }
-* }
-* }
-* @endcode
-*/
-class USBMIDI: public USBDevice {
-public:
-
- /**
- * Constructor
- *
- * @param vendor_id Your vendor_id
- * @param product_id Your product_id
- * @param product_release Your preoduct_release
- */
- USBMIDI(uint16_t vendor_id = 0x0700, uint16_t product_id = 0x0101, uint16_t product_release = 0x0001);
-
- /**
- * Send a MIDIMessage
- *
- * @param m The MIDIMessage to send
- */
- void write(MIDIMessage m);
-
- /**
- * Attach a callback for when a MIDIEvent is received
- *
- * @param fptr function pointer
- */
- void attach(void (*fptr)(MIDIMessage));
-
-
-protected:
- virtual bool EPBULK_OUT_callback();
- virtual bool USBCallback_setConfiguration(uint8_t configuration);
- /*
- * Get string product descriptor
- *
- * @returns pointer to the string product descriptor
- */
- virtual uint8_t * stringIproductDesc();
-
- /*
- * Get string interface descriptor
- *
- * @returns pointer to the string interface descriptor
- */
- virtual uint8_t * stringIinterfaceDesc();
-
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
-private:
- uint8_t data[MAX_MIDI_MESSAGE_SIZE+1];
- uint8_t cur_data;
- bool data_end;
-
- void (*midi_evt)(MIDIMessage);
-};
-
-#endif
--- a/Drivers/USBDevice/USBMSD/USBMSD.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,655 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBMSD.h"
-
-#define DISK_OK 0x00
-#define NO_INIT 0x01
-#define NO_DISK 0x02
-#define WRITE_PROTECT 0x04
-
-#define CBW_Signature 0x43425355
-#define CSW_Signature 0x53425355
-
-// SCSI Commands
-#define TEST_UNIT_READY 0x00
-#define REQUEST_SENSE 0x03
-#define FORMAT_UNIT 0x04
-#define INQUIRY 0x12
-#define MODE_SELECT6 0x15
-#define MODE_SENSE6 0x1A
-#define START_STOP_UNIT 0x1B
-#define MEDIA_REMOVAL 0x1E
-#define READ_FORMAT_CAPACITIES 0x23
-#define READ_CAPACITY 0x25
-#define READ10 0x28
-#define WRITE10 0x2A
-#define VERIFY10 0x2F
-#define READ12 0xA8
-#define WRITE12 0xAA
-#define MODE_SELECT10 0x55
-#define MODE_SENSE10 0x5A
-
-// MSC class specific requests
-#define MSC_REQUEST_RESET 0xFF
-#define MSC_REQUEST_GET_MAX_LUN 0xFE
-
-#define DEFAULT_CONFIGURATION (1)
-
-// max packet size
-#define MAX_PACKET MAX_PACKET_SIZE_EPBULK
-
-// CSW Status
-enum Status {
- CSW_PASSED,
- CSW_FAILED,
- CSW_ERROR,
-};
-
-
-USBMSD::USBMSD(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
- stage = READ_CBW;
- memset((void *)&cbw, 0, sizeof(CBW));
- memset((void *)&csw, 0, sizeof(CSW));
- page = NULL;
-}
-
-USBMSD::~USBMSD() {
- disconnect();
-}
-
-
-// Called in ISR context to process a class specific request
-bool USBMSD::USBCallback_request(void) {
-
- bool success = false;
- CONTROL_TRANSFER * transfer = getTransferPtr();
- static uint8_t maxLUN[1] = {0};
-
- if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
- switch (transfer->setup.bRequest) {
- case MSC_REQUEST_RESET:
- reset();
- success = true;
- break;
- case MSC_REQUEST_GET_MAX_LUN:
- transfer->remaining = 1;
- transfer->ptr = maxLUN;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
- default:
- break;
- }
- }
-
- return success;
-}
-
-
-bool USBMSD::connect(bool blocking) {
- //disk initialization
- if (disk_status() & NO_INIT) {
- if (disk_initialize()) {
- return false;
- }
- }
-
- // get number of blocks
- BlockCount = disk_sectors();
-
- // get memory size
- MemorySize = disk_size();
-
- if (BlockCount > 0) {
- BlockSize = MemorySize / BlockCount;
- if (BlockSize != 0) {
- free(page);
- page = (uint8_t *)malloc(BlockSize * sizeof(uint8_t));
- if (page == NULL)
- return false;
- }
- } else {
- return false;
- }
-
- //connect the device
- USBDevice::connect(blocking);
- return true;
-}
-
-void USBMSD::disconnect() {
- USBDevice::disconnect();
- //De-allocate MSD page size:
- free(page);
- page = NULL;
-}
-
-void USBMSD::reset() {
- stage = READ_CBW;
-}
-
-
-// Called in ISR context called when a data is received
-bool USBMSD::EPBULK_OUT_callback() {
- uint32_t size = 0;
- uint8_t buf[MAX_PACKET_SIZE_EPBULK];
- readEP(EPBULK_OUT, buf, &size, MAX_PACKET_SIZE_EPBULK);
- switch (stage) {
- // the device has to decode the CBW received
- case READ_CBW:
- CBWDecode(buf, size);
- break;
-
- // the device has to receive data from the host
- case PROCESS_CBW:
- switch (cbw.CB[0]) {
- case WRITE10:
- case WRITE12:
- memoryWrite(buf, size);
- break;
- case VERIFY10:
- memoryVerify(buf, size);
- break;
- }
- break;
-
- // an error has occured: stall endpoint and send CSW
- default:
- stallEndpoint(EPBULK_OUT);
- csw.Status = CSW_ERROR;
- sendCSW();
- break;
- }
-
- //reactivate readings on the OUT bulk endpoint
- readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
- return true;
-}
-
-// Called in ISR context when a data has been transferred
-bool USBMSD::EPBULK_IN_callback() {
- switch (stage) {
-
- // the device has to send data to the host
- case PROCESS_CBW:
- switch (cbw.CB[0]) {
- case READ10:
- case READ12:
- memoryRead();
- break;
- }
- break;
-
- //the device has to send a CSW
- case SEND_CSW:
- sendCSW();
- break;
-
- // the host has received the CSW -> we wait a CBW
- case WAIT_CSW:
- stage = READ_CBW;
- break;
-
- // an error has occured
- default:
- stallEndpoint(EPBULK_IN);
- sendCSW();
- break;
- }
- return true;
-}
-
-
-void USBMSD::memoryWrite (uint8_t * buf, uint16_t size) {
-
- if ((addr + size) > MemorySize) {
- size = MemorySize - addr;
- stage = ERROR;
- stallEndpoint(EPBULK_OUT);
- }
-
- // we fill an array in RAM of 1 block before writing it in memory
- for (int i = 0; i < size; i++)
- page[addr%BlockSize + i] = buf[i];
-
- // if the array is filled, write it in memory
- if (!((addr + size)%BlockSize)) {
- if (!(disk_status() & WRITE_PROTECT)) {
- disk_write(page, addr/BlockSize, 1);
- }
- }
-
- addr += size;
- length -= size;
- csw.DataResidue -= size;
-
- if ((!length) || (stage != PROCESS_CBW)) {
- csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
- sendCSW();
- }
-}
-
-void USBMSD::memoryVerify (uint8_t * buf, uint16_t size) {
- uint32_t n;
-
- if ((addr + size) > MemorySize) {
- size = MemorySize - addr;
- stage = ERROR;
- stallEndpoint(EPBULK_OUT);
- }
-
- // beginning of a new block -> load a whole block in RAM
- if (!(addr%BlockSize))
- disk_read(page, addr/BlockSize, 1);
-
- // info are in RAM -> no need to re-read memory
- for (n = 0; n < size; n++) {
- if (page[addr%BlockSize + n] != buf[n]) {
- memOK = false;
- break;
- }
- }
-
- addr += size;
- length -= size;
- csw.DataResidue -= size;
-
- if ( !length || (stage != PROCESS_CBW)) {
- csw.Status = (memOK && (stage == PROCESS_CBW)) ? CSW_PASSED : CSW_FAILED;
- sendCSW();
- }
-}
-
-
-bool USBMSD::inquiryRequest (void) {
- uint8_t inquiry[] = { 0x00, 0x80, 0x00, 0x01,
- 36 - 4, 0x80, 0x00, 0x00,
- 'M', 'B', 'E', 'D', '.', 'O', 'R', 'G',
- 'M', 'B', 'E', 'D', ' ', 'U', 'S', 'B', ' ', 'D', 'I', 'S', 'K', ' ', ' ', ' ',
- '1', '.', '0', ' ',
- };
- if (!write(inquiry, sizeof(inquiry))) {
- return false;
- }
- return true;
-}
-
-
-bool USBMSD::readFormatCapacity() {
- uint8_t capacity[] = { 0x00, 0x00, 0x00, 0x08,
- (uint8_t)((BlockCount >> 24) & 0xff),
- (uint8_t)((BlockCount >> 16) & 0xff),
- (uint8_t)((BlockCount >> 8) & 0xff),
- (uint8_t)((BlockCount >> 0) & 0xff),
-
- 0x02,
- (uint8_t)((BlockSize >> 16) & 0xff),
- (uint8_t)((BlockSize >> 8) & 0xff),
- (uint8_t)((BlockSize >> 0) & 0xff),
- };
- if (!write(capacity, sizeof(capacity))) {
- return false;
- }
- return true;
-}
-
-
-bool USBMSD::readCapacity (void) {
- uint8_t capacity[] = {
- (uint8_t)(((BlockCount - 1) >> 24) & 0xff),
- (uint8_t)(((BlockCount - 1) >> 16) & 0xff),
- (uint8_t)(((BlockCount - 1) >> 8) & 0xff),
- (uint8_t)(((BlockCount - 1) >> 0) & 0xff),
-
- (uint8_t)((BlockSize >> 24) & 0xff),
- (uint8_t)((BlockSize >> 16) & 0xff),
- (uint8_t)((BlockSize >> 8) & 0xff),
- (uint8_t)((BlockSize >> 0) & 0xff),
- };
- if (!write(capacity, sizeof(capacity))) {
- return false;
- }
- return true;
-}
-
-bool USBMSD::write (uint8_t * buf, uint16_t size) {
-
- if (size >= cbw.DataLength) {
- size = cbw.DataLength;
- }
- stage = SEND_CSW;
-
- if (!writeNB(EPBULK_IN, buf, size, MAX_PACKET_SIZE_EPBULK)) {
- return false;
- }
-
- csw.DataResidue -= size;
- csw.Status = CSW_PASSED;
- return true;
-}
-
-
-bool USBMSD::modeSense6 (void) {
- uint8_t sense6[] = { 0x03, 0x00, 0x00, 0x00 };
- if (!write(sense6, sizeof(sense6))) {
- return false;
- }
- return true;
-}
-
-void USBMSD::sendCSW() {
- csw.Signature = CSW_Signature;
- writeNB(EPBULK_IN, (uint8_t *)&csw, sizeof(CSW), MAX_PACKET_SIZE_EPBULK);
- stage = WAIT_CSW;
-}
-
-bool USBMSD::requestSense (void) {
- uint8_t request_sense[] = {
- 0x70,
- 0x00,
- 0x05, // Sense Key: illegal request
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x0A,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x30,
- 0x01,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- };
-
- if (!write(request_sense, sizeof(request_sense))) {
- return false;
- }
-
- return true;
-}
-
-void USBMSD::fail() {
- csw.Status = CSW_FAILED;
- sendCSW();
-}
-
-
-void USBMSD::CBWDecode(uint8_t * buf, uint16_t size) {
- if (size == sizeof(cbw)) {
- memcpy((uint8_t *)&cbw, buf, size);
- if (cbw.Signature == CBW_Signature) {
- csw.Tag = cbw.Tag;
- csw.DataResidue = cbw.DataLength;
- if ((cbw.CBLength < 1) || (cbw.CBLength > 16) ) {
- fail();
- } else {
- switch (cbw.CB[0]) {
- case TEST_UNIT_READY:
- testUnitReady();
- break;
- case REQUEST_SENSE:
- requestSense();
- break;
- case INQUIRY:
- inquiryRequest();
- break;
- case MODE_SENSE6:
- modeSense6();
- break;
- case READ_FORMAT_CAPACITIES:
- readFormatCapacity();
- break;
- case READ_CAPACITY:
- readCapacity();
- break;
- case READ10:
- case READ12:
- if (infoTransfer()) {
- if ((cbw.Flags & 0x80)) {
- stage = PROCESS_CBW;
- memoryRead();
- } else {
- stallEndpoint(EPBULK_OUT);
- csw.Status = CSW_ERROR;
- sendCSW();
- }
- }
- break;
- case WRITE10:
- case WRITE12:
- if (infoTransfer()) {
- if (!(cbw.Flags & 0x80)) {
- stage = PROCESS_CBW;
- } else {
- stallEndpoint(EPBULK_IN);
- csw.Status = CSW_ERROR;
- sendCSW();
- }
- }
- break;
- case VERIFY10:
- if (!(cbw.CB[1] & 0x02)) {
- csw.Status = CSW_PASSED;
- sendCSW();
- break;
- }
- if (infoTransfer()) {
- if (!(cbw.Flags & 0x80)) {
- stage = PROCESS_CBW;
- memOK = true;
- } else {
- stallEndpoint(EPBULK_IN);
- csw.Status = CSW_ERROR;
- sendCSW();
- }
- }
- break;
- case MEDIA_REMOVAL:
- csw.Status = CSW_PASSED;
- sendCSW();
- break;
- default:
- fail();
- break;
- }
- }
- }
- }
-}
-
-void USBMSD::testUnitReady (void) {
-
- if (cbw.DataLength != 0) {
- if ((cbw.Flags & 0x80) != 0) {
- stallEndpoint(EPBULK_IN);
- } else {
- stallEndpoint(EPBULK_OUT);
- }
- }
-
- csw.Status = CSW_PASSED;
- sendCSW();
-}
-
-
-void USBMSD::memoryRead (void) {
- uint32_t n;
-
- n = (length > MAX_PACKET) ? MAX_PACKET : length;
-
- if ((addr + n) > MemorySize) {
- n = MemorySize - addr;
- stage = ERROR;
- }
-
- // we read an entire block
- if (!(addr%BlockSize))
- disk_read(page, addr/BlockSize, 1);
-
- // write data which are in RAM
- writeNB(EPBULK_IN, &page[addr%BlockSize], n, MAX_PACKET_SIZE_EPBULK);
-
- addr += n;
- length -= n;
-
- csw.DataResidue -= n;
-
- if ( !length || (stage != PROCESS_CBW)) {
- csw.Status = (stage == PROCESS_CBW) ? CSW_PASSED : CSW_FAILED;
- stage = (stage == PROCESS_CBW) ? SEND_CSW : stage;
- }
-}
-
-
-bool USBMSD::infoTransfer (void) {
- uint32_t n;
-
- // Logical Block Address of First Block
- n = (cbw.CB[2] << 24) | (cbw.CB[3] << 16) | (cbw.CB[4] << 8) | (cbw.CB[5] << 0);
-
- addr = n * BlockSize;
-
- // Number of Blocks to transfer
- switch (cbw.CB[0]) {
- case READ10:
- case WRITE10:
- case VERIFY10:
- n = (cbw.CB[7] << 8) | (cbw.CB[8] << 0);
- break;
-
- case READ12:
- case WRITE12:
- n = (cbw.CB[6] << 24) | (cbw.CB[7] << 16) | (cbw.CB[8] << 8) | (cbw.CB[9] << 0);
- break;
- }
-
- length = n * BlockSize;
-
- if (!cbw.DataLength) { // host requests no data
- csw.Status = CSW_FAILED;
- sendCSW();
- return false;
- }
-
- if (cbw.DataLength != length) {
- if ((cbw.Flags & 0x80) != 0) {
- stallEndpoint(EPBULK_IN);
- } else {
- stallEndpoint(EPBULK_OUT);
- }
-
- csw.Status = CSW_FAILED;
- sendCSW();
- return false;
- }
-
- return true;
-}
-
-
-
-
-
-// Called in ISR context
-// Set configuration. Return false if the
-// configuration is not supported.
-bool USBMSD::USBCallback_setConfiguration(uint8_t configuration) {
- if (configuration != DEFAULT_CONFIGURATION) {
- return false;
- }
-
- // Configure endpoints > 0
- addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
- addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
-
- //activate readings
- readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
- return true;
-}
-
-
-uint8_t * USBMSD::stringIinterfaceDesc() {
- static uint8_t stringIinterfaceDescriptor[] = {
- 0x08, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'M',0,'S',0,'D',0 //bString iInterface - MSD
- };
- return stringIinterfaceDescriptor;
-}
-
-uint8_t * USBMSD::stringIproductDesc() {
- static uint8_t stringIproductDescriptor[] = {
- 0x12, //bLength
- STRING_DESCRIPTOR, //bDescriptorType 0x03
- 'M',0,'b',0,'e',0,'d',0,' ',0,'M',0,'S',0,'D',0 //bString iProduct - Mbed Audio
- };
- return stringIproductDescriptor;
-}
-
-
-uint8_t * USBMSD::configurationDesc() {
- static uint8_t configDescriptor[] = {
-
- // Configuration 1
- 9, // bLength
- 2, // bDescriptorType
- LSB(9 + 9 + 7 + 7), // wTotalLength
- MSB(9 + 9 + 7 + 7),
- 0x01, // bNumInterfaces
- 0x01, // bConfigurationValue: 0x01 is used to select this configuration
- 0x00, // iConfiguration: no string to describe this configuration
- 0xC0, // bmAttributes
- 100, // bMaxPower, device power consumption is 100 mA
-
- // Interface 0, Alternate Setting 0, MSC Class
- 9, // bLength
- 4, // bDescriptorType
- 0x00, // bInterfaceNumber
- 0x00, // bAlternateSetting
- 0x02, // bNumEndpoints
- 0x08, // bInterfaceClass
- 0x06, // bInterfaceSubClass
- 0x50, // bInterfaceProtocol
- 0x04, // iInterface
-
- // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
- 7, // bLength
- 5, // bDescriptorType
- PHY_TO_DESC(EPBULK_IN), // bEndpointAddress
- 0x02, // bmAttributes (0x02=bulk)
- LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
- 0, // bInterval
-
- // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
- 7, // bLength
- 5, // bDescriptorType
- PHY_TO_DESC(EPBULK_OUT), // bEndpointAddress
- 0x02, // bmAttributes (0x02=bulk)
- LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
- 0 // bInterval
- };
- return configDescriptor;
-}
--- a/Drivers/USBDevice/USBMSD/USBMSD.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,251 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-
-#ifndef USBMSD_H
-#define USBMSD_H
-
-/* These headers are included for child class. */
-#include "USBEndpoints.h"
-#include "USBDescriptor.h"
-#include "USBDevice_Types.h"
-
-#include "USBDevice.h"
-
-/**
- * USBMSD class: generic class in order to use all kinds of blocks storage chip
- *
- * Introduction
- *
- * The USBMSD implements the MSD protocol. It permits to access a memory chip (flash, sdcard,...)
- * from a computer over USB. But this class doesn't work standalone, you need to subclass this class
- * and define virtual functions which are called in USBMSD.
- *
- * How to use this class with your chip ?
- *
- * You have to inherit and define some pure virtual functions (mandatory step):
- * - virtual int disk_read(char * data, int block): function to read a block
- * - virtual int disk_write(const char * data, int block): function to write a block
- * - virtual int disk_initialize(): function to initialize the memory
- * - virtual int disk_sectors(): return the number of blocks
- * - virtual int disk_size(): return the memory size
- * - virtual int disk_status(): return the status of the storage chip (0: OK, 1: not initialized, 2: no medium in the drive, 4: write protection)
- *
- * All functions names are compatible with the fat filesystem library. So you can imagine using your own class with
- * USBMSD and the fat filesystem library in the same program. Just be careful because there are two different parts which
- * will access the sd card. You can do a master/slave system using the disk_status method.
- *
- * Once these functions defined, you can call connect() (at the end of the constructor of your class for instance)
- * of USBMSD to connect your mass storage device. connect() will first call disk_status() to test the status of the disk.
- * If disk_status() returns 1 (disk not initialized), then disk_initialize() is called. After this step, connect() will collect information
- * such as the number of blocks and the memory size.
- */
-class USBMSD: public USBDevice {
-public:
-
- /**
- * Constructor
- *
- * @param vendor_id Your vendor_id
- * @param product_id Your product_id
- * @param product_release Your preoduct_release
- */
- USBMSD(uint16_t vendor_id = 0x0703, uint16_t product_id = 0x0104, uint16_t product_release = 0x0001);
-
- /**
- * Connect the USB MSD device. Establish disk initialization before really connect the device.
- *
- * @param blocking if not configured
- * @returns true if successful
- */
- bool connect(bool blocking = true);
-
- /**
- * Disconnect the USB MSD device.
- */
- void disconnect();
-
- /**
- * Destructor
- */
- ~USBMSD();
-
-protected:
-
- /*
- * read one or more blocks on a storage chip
- *
- * @param data pointer where will be stored read data
- * @param block starting block number
- * @param count number of blocks to read
- * @returns 0 if successful
- */
- virtual int disk_read(uint8_t* data, uint64_t block, uint8_t count) = 0;
-
- /*
- * write one or more blocks on a storage chip
- *
- * @param data data to write
- * @param block starting block number
- * @param count number of blocks to write
- * @returns 0 if successful
- */
- virtual int disk_write(const uint8_t* data, uint64_t block, uint8_t count) = 0;
-
- /*
- * Disk initilization
- */
- virtual int disk_initialize() = 0;
-
- /*
- * Return the number of blocks
- *
- * @returns number of blocks
- */
- virtual uint64_t disk_sectors() = 0;
-
- /*
- * Return memory size
- *
- * @returns memory size
- */
- virtual uint64_t disk_size() = 0;
-
-
- /*
- * To check the status of the storage chip
- *
- * @returns status: 0: OK, 1: disk not initialized, 2: no medium in the drive, 4: write protected
- */
- virtual int disk_status() = 0;
-
- /*
- * Get string product descriptor
- *
- * @returns pointer to the string product descriptor
- */
- virtual uint8_t * stringIproductDesc();
-
- /*
- * Get string interface descriptor
- *
- * @returns pointer to the string interface descriptor
- */
- virtual uint8_t * stringIinterfaceDesc();
-
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
- /*
- * Callback called when a packet is received
- */
- virtual bool EPBULK_OUT_callback();
-
- /*
- * Callback called when a packet has been sent
- */
- virtual bool EPBULK_IN_callback();
-
- /*
- * Set configuration of device. Add endpoints
- */
- virtual bool USBCallback_setConfiguration(uint8_t configuration);
-
- /*
- * Callback called to process class specific requests
- */
- virtual bool USBCallback_request();
-
-
-private:
-
- // MSC Bulk-only Stage
- enum Stage {
- READ_CBW, // wait a CBW
- ERROR, // error
- PROCESS_CBW, // process a CBW request
- SEND_CSW, // send a CSW
- WAIT_CSW, // wait that a CSW has been effectively sent
- };
-
- // Bulk-only CBW
- typedef struct {
- uint32_t Signature;
- uint32_t Tag;
- uint32_t DataLength;
- uint8_t Flags;
- uint8_t LUN;
- uint8_t CBLength;
- uint8_t CB[16];
- } PACKED CBW;
-
- // Bulk-only CSW
- typedef struct {
- uint32_t Signature;
- uint32_t Tag;
- uint32_t DataResidue;
- uint8_t Status;
- } PACKED CSW;
-
- //state of the bulk-only state machine
- Stage stage;
-
- // current CBW
- CBW cbw;
-
- // CSW which will be sent
- CSW csw;
-
- // addr where will be read or written data
- uint32_t addr;
-
- // length of a reading or writing
- uint32_t length;
-
- // memory OK (after a memoryVerify)
- bool memOK;
-
- // cache in RAM before writing in memory. Useful also to read a block.
- uint8_t * page;
-
- int BlockSize;
- uint64_t MemorySize;
- uint64_t BlockCount;
-
- void CBWDecode(uint8_t * buf, uint16_t size);
- void sendCSW (void);
- bool inquiryRequest (void);
- bool write (uint8_t * buf, uint16_t size);
- bool readFormatCapacity();
- bool readCapacity (void);
- bool infoTransfer (void);
- void memoryRead (void);
- bool modeSense6 (void);
- void testUnitReady (void);
- bool requestSense (void);
- void memoryVerify (uint8_t * buf, uint16_t size);
- void memoryWrite (uint8_t * buf, uint16_t size);
- void reset();
- void fail();
-};
-
-#endif
--- a/Drivers/USBDevice/USBSerial/CircBuffer.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef CIRCBUFFER_H
-#define CIRCBUFFER_H
-
-template <class T, int Size>
-class CircBuffer {
-public:
- CircBuffer():write(0), read(0){}
- bool isFull() {
- return ((write + 1) % size == read);
- };
-
- bool isEmpty() {
- return (read == write);
- };
-
- void queue(T k) {
- if (isFull()) {
- read++;
- read %= size;
- }
- buf[write++] = k;
- write %= size;
- }
-
- uint16_t available() {
- return (write >= read) ? write - read : size - read + write;
- };
-
- bool dequeue(T * c) {
- bool empty = isEmpty();
- if (!empty) {
- *c = buf[read++];
- read %= size;
- }
- return(!empty);
- };
-
-private:
- volatile uint16_t write;
- volatile uint16_t read;
- static const int size = Size+1; //a modern optimizer should be able to remove this so it uses no ram.
- T buf[Size+1];
-};
-
-#endif
--- a/Drivers/USBDevice/USBSerial/USBCDC.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBCDC.h"
-
-static uint8_t cdc_line_coding[7]= {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};
-
-#define DEFAULT_CONFIGURATION (1)
-
-#define CDC_SET_LINE_CODING 0x20
-#define CDC_GET_LINE_CODING 0x21
-#define CDC_SET_CONTROL_LINE_STATE 0x22
-
-// Control Line State bits
-#define CLS_DTR (1 << 0)
-#define CLS_RTS (1 << 1)
-
-#define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK
-
-USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking): USBDevice(vendor_id, product_id, product_release) {
- terminal_connected = false;
- USBDevice::connect(connect_blocking);
-}
-
-bool USBCDC::USBCallback_request(void) {
- /* Called in ISR context */
-
- bool success = false;
- CONTROL_TRANSFER * transfer = getTransferPtr();
-
- /* Process class-specific requests */
-
- if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
- switch (transfer->setup.bRequest) {
- case CDC_GET_LINE_CODING:
- transfer->remaining = 7;
- transfer->ptr = cdc_line_coding;
- transfer->direction = DEVICE_TO_HOST;
- success = true;
- break;
- case CDC_SET_LINE_CODING:
- transfer->remaining = 7;
- transfer->notify = true;
- success = true;
- break;
- case CDC_SET_CONTROL_LINE_STATE:
- if (transfer->setup.wValue & CLS_DTR) {
- terminal_connected = true;
- } else {
- terminal_connected = false;
- }
- success = true;
- break;
- default:
- break;
- }
- }
-
- return success;
-}
-
-void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
- // Request of setting line coding has 7 bytes
- if (length != 7) {
- return;
- }
-
- CONTROL_TRANSFER * transfer = getTransferPtr();
-
- /* Process class-specific requests */
- if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
- if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
- if (memcmp(cdc_line_coding, buf, 7)) {
- memcpy(cdc_line_coding, buf, 7);
-
- int baud = buf[0] + (buf[1] << 8)
- + (buf[2] << 16) + (buf[3] << 24);
- int stop = buf[4];
- int bits = buf[6];
- int parity = buf[5];
-
- lineCodingChanged(baud, bits, parity, stop);
- }
- }
- }
-}
-
-// Called in ISR context
-// Set configuration. Return false if the
-// configuration is not supported.
-bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) {
- if (configuration != DEFAULT_CONFIGURATION) {
- return false;
- }
-
- // Configure endpoints > 0
- addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
- addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
- addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
-
- // We activate the endpoint to be able to recceive data
- readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
- return true;
-}
-
-bool USBCDC::send(uint8_t * buffer, uint32_t size) {
- return USBDevice::write(EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE);
-}
-
-bool USBCDC::readEP(uint8_t * buffer, uint32_t * size) {
- if (!USBDevice::readEP(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
- return false;
- if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
- return false;
- return true;
-}
-
-bool USBCDC::readEP_NB(uint8_t * buffer, uint32_t * size) {
- if (!USBDevice::readEP_NB(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
- return false;
- if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
- return false;
- return true;
-}
-
-
-uint8_t * USBCDC::deviceDesc() {
- static uint8_t deviceDescriptor[] = {
- 18, // bLength
- 1, // bDescriptorType
- 0x10, 0x01, // bcdUSB
- 2, // bDeviceClass
- 0, // bDeviceSubClass
- 0, // bDeviceProtocol
- MAX_PACKET_SIZE_EP0, // bMaxPacketSize0
- (uint8_t)(LSB(VENDOR_ID)), (uint8_t)(MSB(VENDOR_ID)), // idVendor
- (uint8_t)(LSB(PRODUCT_ID)), (uint8_t)(MSB(PRODUCT_ID)),// idProduct
- 0x00, 0x01, // bcdDevice
- 1, // iManufacturer
- 2, // iProduct
- 3, // iSerialNumber
- 1 // bNumConfigurations
- };
- return deviceDescriptor;
-}
-
-uint8_t * USBCDC::stringIinterfaceDesc() {
- static uint8_t stringIinterfaceDescriptor[] = {
- 0x08,
- STRING_DESCRIPTOR,
- 'C',0,'D',0,'C',0,
- };
- return stringIinterfaceDescriptor;
-}
-
-uint8_t * USBCDC::stringIproductDesc() {
- static uint8_t stringIproductDescriptor[] = {
- 0x16,
- STRING_DESCRIPTOR,
- 'C',0,'D',0,'C',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0
- };
- return stringIproductDescriptor;
-}
-
-
-#define CONFIG1_DESC_SIZE (9+8+9+5+5+4+5+7+9+7+7)
-
-uint8_t * USBCDC::configurationDesc() {
- static uint8_t configDescriptor[] = {
- // configuration descriptor
- 9, // bLength
- 2, // bDescriptorType
- LSB(CONFIG1_DESC_SIZE), // wTotalLength
- MSB(CONFIG1_DESC_SIZE),
- 2, // bNumInterfaces
- 1, // bConfigurationValue
- 0, // iConfiguration
- 0x80, // bmAttributes
- 50, // bMaxPower
-
- // IAD to associate the two CDC interfaces
- 0x08, // bLength
- 0x0b, // bDescriptorType
- 0x00, // bFirstInterface
- 0x02, // bInterfaceCount
- 0x02, // bFunctionClass
- 0x02, // bFunctionSubClass
- 0, // bFunctionProtocol
- 0, // iFunction
-
- // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
- 9, // bLength
- 4, // bDescriptorType
- 0, // bInterfaceNumber
- 0, // bAlternateSetting
- 1, // bNumEndpoints
- 0x02, // bInterfaceClass
- 0x02, // bInterfaceSubClass
- 0x01, // bInterfaceProtocol
- 0, // iInterface
-
- // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26
- 5, // bFunctionLength
- 0x24, // bDescriptorType
- 0x00, // bDescriptorSubtype
- 0x10, 0x01, // bcdCDC
-
- // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27
- 5, // bFunctionLength
- 0x24, // bDescriptorType
- 0x01, // bDescriptorSubtype
- 0x03, // bmCapabilities
- 1, // bDataInterface
-
- // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28
- 4, // bFunctionLength
- 0x24, // bDescriptorType
- 0x02, // bDescriptorSubtype
- 0x06, // bmCapabilities
-
- // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33
- 5, // bFunctionLength
- 0x24, // bDescriptorType
- 0x06, // bDescriptorSubtype
- 0, // bMasterInterface
- 1, // bSlaveInterface0
-
- // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPINT_IN), // bEndpointAddress
- E_INTERRUPT, // bmAttributes (0x03=intr)
- LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
- 16, // bInterval
-
-
-
-
- // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
- 9, // bLength
- 4, // bDescriptorType
- 1, // bInterfaceNumber
- 0, // bAlternateSetting
- 2, // bNumEndpoints
- 0x0A, // bInterfaceClass
- 0x00, // bInterfaceSubClass
- 0x00, // bInterfaceProtocol
- 0, // iInterface
-
- // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPBULK_IN), // bEndpointAddress
- E_BULK, // bmAttributes (0x02=bulk)
- LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
- 0, // bInterval
-
- // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
- ENDPOINT_DESCRIPTOR_LENGTH, // bLength
- ENDPOINT_DESCRIPTOR, // bDescriptorType
- PHY_TO_DESC(EPBULK_OUT), // bEndpointAddress
- E_BULK, // bmAttributes (0x02=bulk)
- LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
- MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
- 0 // bInterval
- };
- return configDescriptor;
-}
--- a/Drivers/USBDevice/USBSerial/USBCDC.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBCDC_H
-#define USBCDC_H
-
-/* These headers are included for child class. */
-#include "USBEndpoints.h"
-#include "USBDescriptor.h"
-#include "USBDevice_Types.h"
-
-#include "USBDevice.h"
-
-class USBCDC: public USBDevice {
-public:
-
- /*
- * Constructor
- *
- * @param vendor_id Your vendor_id
- * @param product_id Your product_id
- * @param product_release Your preoduct_release
- * @param connect_blocking define if the connection must be blocked if USB not plugged in
- */
- USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking);
-
- volatile bool terminal_connected;
-
-protected:
-
- /*
- * Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
- *
- * @returns pointer to the device descriptor
- */
- virtual uint8_t * deviceDesc();
-
- /*
- * Get string product descriptor
- *
- * @returns pointer to the string product descriptor
- */
- virtual uint8_t * stringIproductDesc();
-
- /*
- * Get string interface descriptor
- *
- * @returns pointer to the string interface descriptor
- */
- virtual uint8_t * stringIinterfaceDesc();
-
- /*
- * Get configuration descriptor
- *
- * @returns pointer to the configuration descriptor
- */
- virtual uint8_t * configurationDesc();
-
- /*
- * Send a buffer
- *
- * @param endpoint endpoint which will be sent the buffer
- * @param buffer buffer to be sent
- * @param size length of the buffer
- * @returns true if successful
- */
- bool send(uint8_t * buffer, uint32_t size);
-
- /*
- * Read a buffer from a certain endpoint. Warning: blocking
- *
- * @param endpoint endpoint to read
- * @param buffer buffer where will be stored bytes
- * @param size the number of bytes read will be stored in *size
- * @param maxSize the maximum length that can be read
- * @returns true if successful
- */
- bool readEP(uint8_t * buffer, uint32_t * size);
-
- /*
- * Read a buffer from a certain endpoint. Warning: non blocking
- *
- * @param endpoint endpoint to read
- * @param buffer buffer where will be stored bytes
- * @param size the number of bytes read will be stored in *size
- * @param maxSize the maximum length that can be read
- * @returns true if successful
- */
- bool readEP_NB(uint8_t * buffer, uint32_t * size);
-
- /*
- * Called by USBCallback_requestCompleted when CDC line coding is changed
- * Warning: Called in ISR
- *
- * @param baud The baud rate
- * @param bits The number of bits in a word (5-8)
- * @param parity The parity
- * @param stop The number of stop bits (1 or 2)
- */
- virtual void lineCodingChanged(int baud, int bits, int parity, int stop) {};
-
-protected:
- virtual bool USBCallback_request();
- virtual void USBCallback_requestCompleted(uint8_t *buf, uint32_t length);
- virtual bool USBCallback_setConfiguration(uint8_t configuration);
-
-};
-
-#endif
--- a/Drivers/USBDevice/USBSerial/USBSerial.cpp Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include "stdint.h"
-#include "USBSerial.h"
-
-int USBSerial::_putc(int c) {
- if (!terminal_connected)
- return 0;
- send((uint8_t *)&c, 1);
- return 1;
-}
-
-int USBSerial::_getc() {
- uint8_t c = 0;
- while (buf.isEmpty());
- buf.dequeue(&c);
- return c;
-}
-
-
-bool USBSerial::writeBlock(uint8_t * buf, uint16_t size) {
- if(size > MAX_PACKET_SIZE_EPBULK) {
- return false;
- }
- if(!send(buf, size)) {
- return false;
- }
- return true;
-}
-
-
-
-bool USBSerial::EPBULK_OUT_callback() {
- uint8_t c[65];
- uint32_t size = 0;
-
- //we read the packet received and put it on the circular buffer
- readEP(c, &size);
- for (uint32_t i = 0; i < size; i++) {
- buf.queue(c[i]);
- }
-
- //call a potential handler
- rx.call();
-
- return true;
-}
-
-uint8_t USBSerial::available() {
- return buf.available();
-}
--- a/Drivers/USBDevice/USBSerial/USBSerial.h Mon Mar 18 10:21:53 2019 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef USBSERIAL_H
-#define USBSERIAL_H
-
-#include "USBCDC.h"
-#include "Stream.h"
-#include "CircBuffer.h"
-
-
-/**
-* USBSerial example
-*
-* @code
-* #include "mbed.h"
-* #include "USBSerial.h"
-*
-* //Virtual serial port over USB
-* USBSerial serial;
-*
-* int main(void) {
-*
-* while(1)
-* {
-* serial.printf("I am a virtual serial port\n");
-* wait(1);
-* }
-* }
-* @endcode
-*/
-class USBSerial: public USBCDC, public Stream {
-public:
-
- /**
- * Constructor
- *
- * @param vendor_id Your vendor_id (default: 0x1f00)
- * @param product_id Your product_id (default: 0x2012)
- * @param product_release Your preoduct_release (default: 0x0001)
- * @param connect_blocking define if the connection must be blocked if USB not plugged in
- *
- */
- USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001, bool connect_blocking = true): USBCDC(vendor_id, product_id, product_release, connect_blocking){
- settingsChangedCallback = 0;
- };
-
-
- /**
- * Send a character. You can use puts, printf.
- *
- * @param c character to be sent
- * @returns true if there is no error, false otherwise
- */
- virtual int _putc(int c);
-
- /**
- * Read a character: blocking
- *
- * @returns character read
- */
- virtual int _getc();
-
- /**
- * Check the number of bytes available.
- *
- * @returns the number of bytes available
- */
- uint8_t available();
-
- /** Determine if there is a character available to read
- *
- * @returns
- * 1 if there is a character available to read,
- * 0 otherwise
- */
- int readable() { return available() ? 1 : 0; }
-
- /** Determine if there is space available to write a character
- *
- * @returns
- * 1 if there is space to write a character,
- * 0 otherwise
- */
- int writeable() { return 1; } // always return 1, for write operation is blocking
-
- /**
- * Write a block of data.
- *
- * For more efficiency, a block of size 64 (maximum size of a bulk endpoint) has to be written.
- *
- * @param buf pointer on data which will be written
- * @param size size of the buffer. The maximum size of a block is limited by the size of the endpoint (64 bytes)
- *
- * @returns true if successfull
- */
- bool writeBlock(uint8_t * buf, uint16_t size);
-
- /**
- * Attach a member function to call when a packet is received.
- *
- * @param tptr pointer to the object to call the member function on
- * @param mptr pointer to the member function to be called
- */
- template<typename T>
- void attach(T* tptr, void (T::*mptr)(void)) {
- if((mptr != NULL) && (tptr != NULL)) {
- rx.attach(tptr, mptr);
- }
- }
-
- /**
- * Attach a callback called when a packet is received
- *
- * @param fptr function pointer
- */
- void attach(void (*fptr)(void)) {
- if(fptr != NULL) {
- rx.attach(fptr);
- }
- }
-
- /**
- * Attach a callback to call when serial's settings are changed.
- *
- * @param fptr function pointer
- */
- void attach(void (*fptr)(int baud, int bits, int parity, int stop)) {
- settingsChangedCallback = fptr;
- }
-
-protected:
- virtual bool EPBULK_OUT_callback();
- virtual void lineCodingChanged(int baud, int bits, int parity, int stop){
- if (settingsChangedCallback) {
- settingsChangedCallback(baud, bits, parity, stop);
- }
- }
-
-private:
- FunctionPointer rx;
- CircBuffer<uint8_t,128> buf;
- void (*settingsChangedCallback)(int baud, int bits, int parity, int stop);
-};
-
-#endif

Health Sensor Board Embedded Heart Rate Algorithm Sensor Hub + ECG, Wearables Ev Kit MAXREFDES101#