mirror of https://github.com/ARMmbed/mbed-os.git
spaces removal - USBDevice
parent
081230ee9c
commit
07dff2db5e
|
@ -50,7 +50,7 @@
|
|||
*
|
||||
* int main() {
|
||||
* int16_t buf[AUDIO_LENGTH_PACKET/2];
|
||||
*
|
||||
*
|
||||
* while (1) {
|
||||
* // read an audio packet
|
||||
* audio.read((uint8_t *)buf);
|
||||
|
@ -88,7 +88,7 @@ public:
|
|||
* @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
|
||||
*
|
||||
|
@ -97,7 +97,7 @@ public:
|
|||
* @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
|
||||
*
|
||||
|
@ -106,7 +106,7 @@ public:
|
|||
* @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.
|
||||
*
|
||||
|
@ -114,7 +114,7 @@ public:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool write(uint8_t * buf);
|
||||
|
||||
|
||||
/**
|
||||
* Write and read an audio packet at the same time (on the same frame)
|
||||
*
|
||||
|
@ -123,7 +123,7 @@ public:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool readWrite(uint8_t * buf_read, uint8_t * buf_write);
|
||||
|
||||
|
||||
|
||||
/** attach a handler to update the volume
|
||||
*
|
||||
|
@ -212,12 +212,12 @@ protected:
|
|||
* Callback called on each Start of Frame event
|
||||
*/
|
||||
virtual void SOF(int frameNumber);
|
||||
|
||||
|
||||
/*
|
||||
* Callback called when a packet is received
|
||||
*/
|
||||
virtual bool EP3_OUT_callback();
|
||||
|
||||
|
||||
/*
|
||||
* Callback called when a packet has been sent
|
||||
*/
|
||||
|
@ -227,13 +227,13 @@ 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;
|
||||
|
||||
|
@ -248,7 +248,7 @@ private:
|
|||
// 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;
|
||||
|
@ -270,16 +270,16 @@ private:
|
|||
|
||||
// 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;
|
||||
|
||||
};
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
|
||||
/*string offset*/
|
||||
#define STRING_OFFSET_LANGID (0)
|
||||
#define STRING_OFFSET_LANGID (0)
|
||||
#define STRING_OFFSET_IMANUFACTURER (1)
|
||||
#define STRING_OFFSET_IPRODUCT (2)
|
||||
#define STRING_OFFSET_ISERIAL (3)
|
||||
|
|
|
@ -106,7 +106,7 @@ bool USBDevice::requestGetDescriptor(void)
|
|||
transfer.ptr = stringImanufacturerDesc();
|
||||
transfer.direction = DEVICE_TO_HOST;
|
||||
success = true;
|
||||
break;
|
||||
break;
|
||||
case STRING_OFFSET_IPRODUCT:
|
||||
#ifdef DEBUG
|
||||
printf("3\r\n");
|
||||
|
@ -115,7 +115,7 @@ bool USBDevice::requestGetDescriptor(void)
|
|||
transfer.ptr = stringIproductDesc();
|
||||
transfer.direction = DEVICE_TO_HOST;
|
||||
success = true;
|
||||
break;
|
||||
break;
|
||||
case STRING_OFFSET_ISERIAL:
|
||||
#ifdef DEBUG
|
||||
printf("4\r\n");
|
||||
|
@ -124,7 +124,7 @@ bool USBDevice::requestGetDescriptor(void)
|
|||
transfer.ptr = stringIserialDesc();
|
||||
transfer.direction = DEVICE_TO_HOST;
|
||||
success = true;
|
||||
break;
|
||||
break;
|
||||
case STRING_OFFSET_ICONFIGURATION:
|
||||
#ifdef DEBUG
|
||||
printf("5\r\n");
|
||||
|
@ -133,7 +133,7 @@ bool USBDevice::requestGetDescriptor(void)
|
|||
transfer.ptr = stringIConfigurationDesc();
|
||||
transfer.direction = DEVICE_TO_HOST;
|
||||
success = true;
|
||||
break;
|
||||
break;
|
||||
case STRING_OFFSET_IINTERFACE:
|
||||
#ifdef DEBUG
|
||||
printf("6\r\n");
|
||||
|
@ -142,7 +142,7 @@ bool USBDevice::requestGetDescriptor(void)
|
|||
transfer.ptr = stringIinterfaceDesc();
|
||||
transfer.direction = DEVICE_TO_HOST;
|
||||
success = true;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case INTERFACE_DESCRIPTOR:
|
||||
|
@ -357,7 +357,7 @@ bool USBDevice::requestSetInterface(void)
|
|||
{
|
||||
success = true;
|
||||
currentInterface = transfer.setup.wIndex;
|
||||
currentAlternate = transfer.setup.wValue;
|
||||
currentAlternate = transfer.setup.wValue;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
@ -473,12 +473,12 @@ bool USBDevice::requestGetStatus(void)
|
|||
|
||||
if (success)
|
||||
{
|
||||
/* Send the status */
|
||||
/* Send the status */
|
||||
transfer.ptr = (uint8_t *)&status; /* Assumes little endian */
|
||||
transfer.remaining = sizeof(status);
|
||||
transfer.direction = DEVICE_TO_HOST;
|
||||
}
|
||||
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
@ -546,7 +546,7 @@ bool USBDevice::controlSetup(void)
|
|||
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,
|
||||
|
@ -593,7 +593,7 @@ bool USBDevice::controlSetup(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
/* OUT data stage is required */
|
||||
if (transfer.direction != HOST_TO_DEVICE)
|
||||
{
|
||||
|
@ -707,7 +707,7 @@ void USBDevice::connect(bool blocking)
|
|||
{
|
||||
/* Connect device */
|
||||
USBHAL::connect();
|
||||
|
||||
|
||||
if (blocking) {
|
||||
/* Block if not configured */
|
||||
while (!configured());
|
||||
|
@ -793,8 +793,8 @@ 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;
|
||||
VENDOR_ID = vendor_id;
|
||||
PRODUCT_ID = product_id;
|
||||
PRODUCT_RELEASE = product_release;
|
||||
|
||||
/* Set initial device state */
|
||||
|
@ -818,12 +818,12 @@ bool USBDevice::write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if(!configured()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* Send report */
|
||||
result = endpointWrite(endpoint, buffer, size);
|
||||
|
||||
|
@ -849,7 +849,7 @@ bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint3
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if(!configured()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -872,7 +872,7 @@ bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint3
|
|||
bool USBDevice::readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
|
||||
{
|
||||
EP_STATUS result;
|
||||
|
||||
|
||||
if(!configured()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -889,13 +889,13 @@ bool USBDevice::readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,26 +27,26 @@ 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
|
||||
*
|
||||
|
@ -65,7 +65,7 @@ public:
|
|||
* @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.
|
||||
|
@ -79,20 +79,20 @@ public:
|
|||
* @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 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.
|
||||
*
|
||||
|
@ -104,8 +104,8 @@ public:
|
|||
* @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.
|
||||
*
|
||||
|
@ -118,14 +118,14 @@ public:
|
|||
*/
|
||||
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
|
||||
|
@ -133,8 +133,8 @@ public:
|
|||
*
|
||||
* @returns true if class handles this request
|
||||
*/
|
||||
virtual bool USBCallback_request() { return false; };
|
||||
|
||||
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
|
||||
|
@ -146,7 +146,7 @@ public:
|
|||
* @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.
|
||||
|
@ -154,7 +154,7 @@ public:
|
|||
* @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.
|
||||
*
|
||||
|
@ -170,63 +170,63 @@ public:
|
|||
* @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:
|
||||
|
@ -238,7 +238,7 @@ protected:
|
|||
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;
|
||||
|
@ -262,7 +262,7 @@ private:
|
|||
|
||||
CONTROL_TRANSFER transfer;
|
||||
USB_DEVICE device;
|
||||
|
||||
|
||||
uint16_t currentInterface;
|
||||
uint8_t currentAlternate;
|
||||
};
|
||||
|
|
|
@ -23,38 +23,38 @@
|
|||
|
||||
/* 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)
|
||||
#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 */
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ public:
|
|||
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){};
|
||||
|
@ -67,7 +67,7 @@ protected:
|
|||
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;};
|
||||
|
@ -102,7 +102,7 @@ protected:
|
|||
virtual bool EP15_IN_callback(){return false;};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
private:
|
||||
void usbisr(void);
|
||||
static void _usbisr(void);
|
||||
|
@ -116,6 +116,6 @@ private:
|
|||
bool (USBHAL::*epCallback[32 - 2])(void);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -134,7 +134,7 @@ void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size) {
|
|||
|
||||
USBHAL::USBHAL(void) {
|
||||
NVIC_DisableIRQ(USB_IRQ);
|
||||
|
||||
|
||||
// fill in callback array
|
||||
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
||||
epCallback[1] = &USBHAL::EP1_IN_callback;
|
||||
|
@ -149,7 +149,7 @@ USBHAL::USBHAL(void) {
|
|||
// USB_VBUS input with pull-down
|
||||
LPC_IOCON->PIO0_3 = 0x00000009;
|
||||
#endif
|
||||
|
||||
|
||||
// nUSB_CONNECT output
|
||||
LPC_IOCON->PIO0_6 = 0x00000001;
|
||||
|
||||
|
@ -287,13 +287,13 @@ EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
|
|||
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;
|
||||
|
@ -408,7 +408,7 @@ EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size)
|
|||
|
||||
EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
|
||||
uint32_t bf;
|
||||
|
||||
|
||||
// Validate parameters
|
||||
if (endpoint > LAST_PHYSICAL_ENDPOINT) {
|
||||
return EP_INVALID;
|
||||
|
@ -680,7 +680,7 @@ void USBHAL::usbisr(void) {
|
|||
// 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);
|
||||
|
|
|
@ -279,7 +279,7 @@ uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
|
|||
SIEselectEndpoint(endpoint);
|
||||
SIEclearBuffer();
|
||||
}
|
||||
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
@ -327,7 +327,7 @@ static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size)
|
|||
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;
|
||||
|
@ -466,7 +466,7 @@ EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_
|
|||
if (!(epComplete & EP(endpoint)))
|
||||
return EP_PENDING;
|
||||
}
|
||||
|
||||
|
||||
*bytesRead = endpointReadcore(endpoint, buffer);
|
||||
epComplete &= ~EP(endpoint);
|
||||
return EP_COMPLETED;
|
||||
|
@ -606,7 +606,7 @@ void USBHAL::usbisr(void) {
|
|||
LPC_USB->USBDevIntClr = EP_SLOW;
|
||||
EP0in();
|
||||
}
|
||||
|
||||
|
||||
for (uint8_t num = 2; num < 16*2; num++) {
|
||||
if (LPC_USB->USBEpIntSt & EP(num)) {
|
||||
selectEndpointClearInterrupt(num);
|
||||
|
|
|
@ -280,7 +280,7 @@ uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
|
|||
SIEselectEndpoint(endpoint);
|
||||
SIEclearBuffer();
|
||||
}
|
||||
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
@ -328,7 +328,7 @@ static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size)
|
|||
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;
|
||||
|
@ -367,7 +367,7 @@ USBHAL::USBHAL(void) {
|
|||
// 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;
|
||||
|
||||
|
@ -375,13 +375,13 @@ USBHAL::USBHAL(void) {
|
|||
// 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;
|
||||
LPC_IOCON->P0_14 |= 0x03;
|
||||
|
||||
// Connect must be low for at least 2.5uS
|
||||
wait(0.3);
|
||||
|
@ -471,7 +471,7 @@ EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_
|
|||
if (!(epComplete & EP(endpoint)))
|
||||
return EP_PENDING;
|
||||
}
|
||||
|
||||
|
||||
*bytesRead = endpointReadcore(endpoint, buffer);
|
||||
epComplete &= ~EP(endpoint);
|
||||
return EP_COMPLETED;
|
||||
|
@ -611,7 +611,7 @@ void USBHAL::usbisr(void) {
|
|||
LPC_USB->DevIntClr = EP_SLOW;
|
||||
EP0in();
|
||||
}
|
||||
|
||||
|
||||
for (uint8_t num = 2; num < 16*2; num++) {
|
||||
if (LPC_USB->EpIntSt & EP(num)) {
|
||||
selectEndpointClearInterrupt(num);
|
||||
|
|
|
@ -36,7 +36,7 @@ uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
USBHAL::USBHAL(void) {
|
||||
USBHAL::USBHAL(void) {
|
||||
NVIC_DisableIRQ(OTG_FS_IRQn);
|
||||
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
||||
epCallback[1] = &USBHAL::EP1_IN_callback;
|
||||
|
@ -63,7 +63,7 @@ USBHAL::USBHAL(void) {
|
|||
pin_mode(PA_9, OpenDrain);
|
||||
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
||||
|
||||
|
||||
// Enable interrupts
|
||||
OTG_FS->GREGS.GAHBCFG |= (1 << 0);
|
||||
|
||||
|
@ -116,21 +116,21 @@ bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
|
|||
|
||||
uint32_t type;
|
||||
switch (endpoint) {
|
||||
case EP0IN:
|
||||
case EP0IN:
|
||||
case EP0OUT:
|
||||
type = 0;
|
||||
break;
|
||||
break;
|
||||
case EPISO_IN:
|
||||
case EPISO_OUT:
|
||||
type = 1;
|
||||
type = 1;
|
||||
case EPBULK_IN:
|
||||
case EPBULK_OUT:
|
||||
type = 2;
|
||||
break;
|
||||
type = 2;
|
||||
break;
|
||||
case EPINT_IN:
|
||||
case EPINT_OUT:
|
||||
type = 3;
|
||||
break;
|
||||
type = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
// Generic in or out EP controls
|
||||
|
@ -154,7 +154,7 @@ bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
|
|||
if (endpoint != EP0IN) {
|
||||
control |= (1 << 28); // SD0PID
|
||||
}
|
||||
|
||||
|
||||
control |= (epIndex << 22) | // TxFIFO index
|
||||
(1 << 27); // SNAK
|
||||
OTG_FS->INEP_REGS[epIndex].DIEPCTL = control;
|
||||
|
@ -166,7 +166,7 @@ bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
|
|||
// 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));
|
||||
}
|
||||
|
@ -190,7 +190,7 @@ uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
|
|||
for (uint32_t i = 0; i < length; i += 4) {
|
||||
buffer32[i >> 2] = OTG_FS->FIFO[0][0];
|
||||
}
|
||||
|
||||
|
||||
rxFifoCount = 0;
|
||||
return length;
|
||||
}
|
||||
|
@ -266,7 +266,7 @@ EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
|
|||
return EP_COMPLETED;
|
||||
}
|
||||
|
||||
return EP_PENDING;
|
||||
return EP_PENDING;
|
||||
}
|
||||
|
||||
void USBHAL::stallEndpoint(uint8_t endpoint) {
|
||||
|
@ -282,7 +282,7 @@ void USBHAL::stallEndpoint(uint8_t endpoint) {
|
|||
}
|
||||
|
||||
void USBHAL::unstallEndpoint(uint8_t endpoint) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool USBHAL::getEndpointStallState(uint8_t endpoint) {
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
*
|
||||
* 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,
|
||||
* 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.
|
||||
|
@ -70,7 +70,7 @@ typedef struct // 800h
|
|||
}
|
||||
USB_OTG_DREGS;
|
||||
|
||||
typedef struct
|
||||
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*/
|
||||
|
@ -83,7 +83,7 @@ typedef struct
|
|||
}
|
||||
USB_OTG_INEPREGS;
|
||||
|
||||
typedef struct
|
||||
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*/
|
||||
|
@ -117,7 +117,7 @@ typedef struct
|
|||
}
|
||||
USB_OTG_HC_REGS;
|
||||
|
||||
typedef struct
|
||||
typedef struct
|
||||
{
|
||||
USB_OTG_GREGS GREGS;
|
||||
uint32_t RESERVED0[188];
|
||||
|
|
|
@ -121,7 +121,7 @@ bool USBHID::USBCallback_request() {
|
|||
success = true;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -70,8 +70,8 @@ public:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool send(HID_REPORT *report);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Send a Report. warning: non blocking
|
||||
*
|
||||
|
@ -79,7 +79,7 @@ public:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool sendNB(HID_REPORT *report);
|
||||
|
||||
|
||||
/**
|
||||
* Read a report: blocking
|
||||
*
|
||||
|
@ -87,7 +87,7 @@ public:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool read(HID_REPORT * report);
|
||||
|
||||
|
||||
/**
|
||||
* Read a report: non blocking
|
||||
*
|
||||
|
@ -98,7 +98,7 @@ public:
|
|||
|
||||
protected:
|
||||
uint16_t reportLength;
|
||||
|
||||
|
||||
/*
|
||||
* Get the Report descriptor
|
||||
*
|
||||
|
@ -119,14 +119,14 @@ protected:
|
|||
* @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
|
||||
*
|
||||
|
|
|
@ -183,7 +183,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
|||
{0x4a, 0}, /* HOME */
|
||||
{0x4b, 0}, /* PAGE_UP */
|
||||
{0x4e, 0}, /* PAGE_DOWN */
|
||||
|
||||
|
||||
{0x4f, 0}, /* RIGHT_ARROW */
|
||||
{0x50, 0}, /* LEFT_ARROW */
|
||||
{0x51, 0}, /* DOWN_ARROW */
|
||||
|
@ -344,7 +344,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
|||
{0x4a, 0}, /* HOME */
|
||||
{0x4b, 0}, /* PAGE_UP */
|
||||
{0x4e, 0}, /* PAGE_DOWN */
|
||||
|
||||
|
||||
{0x4f, 0}, /* RIGHT_ARROW */
|
||||
{0x50, 0}, /* LEFT_ARROW */
|
||||
{0x51, 0}, /* DOWN_ARROW */
|
||||
|
@ -424,10 +424,10 @@ bool USBKeyboard::EP1_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;
|
||||
|
|
|
@ -53,7 +53,7 @@ enum FUNCTION_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 */
|
||||
|
@ -62,7 +62,7 @@ enum FUNCTION_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 */
|
||||
|
|
|
@ -35,7 +35,7 @@ enum MOUSE_BUTTON
|
|||
/* 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 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 */
|
||||
|
@ -85,7 +85,7 @@ enum MOUSE_TYPE
|
|||
* 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;
|
||||
|
@ -95,7 +95,7 @@ enum MOUSE_TYPE
|
|||
* {
|
||||
* 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);
|
||||
|
@ -107,7 +107,7 @@ enum MOUSE_TYPE
|
|||
class USBMouse: public USBHID
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
|
@ -117,14 +117,14 @@ class USBMouse: public USBHID
|
|||
* @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):
|
||||
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
|
||||
*
|
||||
|
@ -135,8 +135,8 @@ class USBMouse: public USBHID
|
|||
* @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)
|
||||
*
|
||||
|
@ -145,7 +145,7 @@ class USBMouse: public USBHID
|
|||
* @returns true if there is no error, false otherwise
|
||||
*/
|
||||
bool move(int16_t x, int16_t y);
|
||||
|
||||
|
||||
/**
|
||||
* Press one or several buttons
|
||||
*
|
||||
|
@ -153,7 +153,7 @@ class USBMouse: public USBHID
|
|||
* @returns true if there is no error, false otherwise
|
||||
*/
|
||||
bool press(uint8_t button);
|
||||
|
||||
|
||||
/**
|
||||
* Release one or several buttons
|
||||
*
|
||||
|
@ -161,22 +161,22 @@ class USBMouse: public USBHID
|
|||
* @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);
|
||||
|
||||
bool click(uint8_t button);
|
||||
|
||||
/**
|
||||
* Scrolling
|
||||
*
|
||||
|
@ -184,7 +184,7 @@ class USBMouse: public USBHID
|
|||
* @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.
|
||||
*
|
||||
|
@ -199,7 +199,7 @@ class USBMouse: public USBHID
|
|||
* @returns pointer to the configuration descriptor
|
||||
*/
|
||||
virtual uint8_t * configurationDesc();
|
||||
|
||||
|
||||
private:
|
||||
MOUSE_TYPE mouse_type;
|
||||
uint8_t button;
|
||||
|
|
|
@ -178,7 +178,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
|||
{0x4a, 0}, /* HOME */
|
||||
{0x4b, 0}, /* PAGE_UP */
|
||||
{0x4e, 0}, /* PAGE_DOWN */
|
||||
|
||||
|
||||
{0x4f, 0}, /* RIGHT_ARROW */
|
||||
{0x50, 0}, /* LEFT_ARROW */
|
||||
{0x51, 0}, /* DOWN_ARROW */
|
||||
|
@ -339,7 +339,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
|||
{0x4a, 0}, /* HOME */
|
||||
{0x4b, 0}, /* PAGE_UP */
|
||||
{0x4e, 0}, /* PAGE_DOWN */
|
||||
|
||||
|
||||
{0x4f, 0}, /* RIGHT_ARROW */
|
||||
{0x50, 0}, /* LEFT_ARROW */
|
||||
{0x51, 0}, /* DOWN_ARROW */
|
||||
|
@ -552,10 +552,10 @@ bool USBMouseKeyboard::EP1_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;
|
||||
|
@ -696,7 +696,7 @@ bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
|
|||
report.length = 2;
|
||||
|
||||
send(&report);
|
||||
|
||||
|
||||
report.data[0] = REPORT_ID_VOLUME;
|
||||
report.data[1] = 0;
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "Stream.h"
|
||||
#include "USBHID.h"
|
||||
|
||||
/**
|
||||
/**
|
||||
* USBMouseKeyboard example
|
||||
* @code
|
||||
*
|
||||
|
@ -70,7 +70,7 @@
|
|||
class USBMouseKeyboard: public USBHID, public Stream
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
|
@ -81,7 +81,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @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):
|
||||
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;
|
||||
|
@ -89,7 +89,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
this->mouse_type = mouse_type;
|
||||
connect();
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Write a state of the mouse
|
||||
*
|
||||
|
@ -100,8 +100,8 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @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)
|
||||
*
|
||||
|
@ -110,7 +110,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @returns true if there is no error, false otherwise
|
||||
*/
|
||||
bool move(int16_t x, int16_t y);
|
||||
|
||||
|
||||
/**
|
||||
* Press one or several buttons
|
||||
*
|
||||
|
@ -118,7 +118,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @returns true if there is no error, false otherwise
|
||||
*/
|
||||
bool press(uint8_t button);
|
||||
|
||||
|
||||
/**
|
||||
* Release one or several buttons
|
||||
*
|
||||
|
@ -126,22 +126,22 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @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);
|
||||
|
||||
bool click(uint8_t button);
|
||||
|
||||
/**
|
||||
* Scrolling
|
||||
*
|
||||
|
@ -151,7 +151,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
bool scroll(int8_t z);
|
||||
|
||||
/**
|
||||
* To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key
|
||||
* To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key
|
||||
*
|
||||
* @code
|
||||
* //To send CTRL + s (save)
|
||||
|
@ -163,7 +163,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @returns true if there is no error, false otherwise
|
||||
*/
|
||||
bool keyCode(uint8_t key, uint8_t modifier = 0);
|
||||
|
||||
|
||||
/**
|
||||
* Send a character
|
||||
*
|
||||
|
@ -171,7 +171,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @returns true if there is no error, false otherwise
|
||||
*/
|
||||
virtual int _putc(int c);
|
||||
|
||||
|
||||
/**
|
||||
* Control media keys
|
||||
*
|
||||
|
@ -179,7 +179,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @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
|
||||
|
@ -189,30 +189,30 @@ class USBMouseKeyboard: public USBHID, public Stream
|
|||
* @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 EP1_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;}
|
||||
};
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include "mbed.h"
|
||||
|
||||
// MIDI Message Format
|
||||
//
|
||||
//
|
||||
// [ msg(4) | channel(4) ] [ 0 | n(7) ] [ 0 | m(7) ]
|
||||
//
|
||||
// MIDI Data Messages (Channel Specific)
|
||||
|
@ -43,15 +43,15 @@
|
|||
class MIDIMessage {
|
||||
public:
|
||||
MIDIMessage() {}
|
||||
|
||||
|
||||
MIDIMessage(uint8_t *buf) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
data[i] = buf[i];
|
||||
}
|
||||
|
||||
|
||||
// create messages
|
||||
|
||||
/** Create a NoteOff message
|
||||
|
||||
/** Create a NoteOff message
|
||||
* @param key Key ID
|
||||
* @param velocity Key velocity (0-127, default = 127)
|
||||
* @param channel Key channel (0-15, default 0)
|
||||
|
@ -62,11 +62,11 @@ public:
|
|||
msg.data[0] = CABLE_NUM | 0x08;
|
||||
msg.data[1] = 0x80 | (channel & 0x0F);
|
||||
msg.data[2] = key & 0x7F;
|
||||
msg.data[3] = velocity & 0x7F;
|
||||
msg.data[3] = velocity & 0x7F;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create a NoteOn message
|
||||
|
||||
/** Create a NoteOn message
|
||||
* @param key Key ID
|
||||
* @param velocity Key velocity (0-127, default = 127)
|
||||
* @param channel Key channel (0-15, default 0)
|
||||
|
@ -77,26 +77,26 @@ public:
|
|||
msg.data[0] = CABLE_NUM | 0x09;
|
||||
msg.data[1] = 0x90 | (channel & 0x0F);
|
||||
msg.data[2] = key & 0x7F;
|
||||
msg.data[3] = velocity & 0x7F;
|
||||
msg.data[3] = velocity & 0x7F;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create a PolyPhonic Aftertouch message
|
||||
|
||||
/** 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;
|
||||
msg.data[3] = pressure & 0x7F;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create a Control Change message
|
||||
|
||||
/** Create a Control Change message
|
||||
* @param control Controller ID
|
||||
* @param value Controller value (0-127)
|
||||
* @param channel Controller channel (0-15, default 0)
|
||||
|
@ -107,63 +107,63 @@ public:
|
|||
msg.data[0] = CABLE_NUM | 0x0B;
|
||||
msg.data[1] = 0xB0 | (channel & 0x0F);
|
||||
msg.data[2] = control & 0x7F;
|
||||
msg.data[3] = value & 0x7F;
|
||||
msg.data[3] = value & 0x7F;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create a Program Change message
|
||||
|
||||
/** 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;
|
||||
msg.data[3] = 0x00;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create a Channel Aftertouch message
|
||||
* @param pressure Pressure
|
||||
|
||||
/** 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;
|
||||
msg.data[3] = 0x00;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create a Pitch Wheel message
|
||||
|
||||
/** 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;
|
||||
msg.data[3] = (p >> 7) & 0x7F;
|
||||
return msg;
|
||||
}
|
||||
|
||||
/** Create an All Notes Off message
|
||||
|
||||
/** 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);
|
||||
}
|
||||
|
||||
|
||||
// decode messages
|
||||
|
||||
|
||||
/** MIDI Message Types */
|
||||
enum MIDIMessageType {
|
||||
ErrorType,
|
||||
|
@ -176,16 +176,16 @@ public:
|
|||
PitchWheelType,
|
||||
AllNotesOffType
|
||||
};
|
||||
|
||||
|
||||
/** 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:
|
||||
case 0xB:
|
||||
if(controller() < 120) { // standard controllers
|
||||
return ControlChangeType;
|
||||
} else if(controller() == 123) {
|
||||
|
@ -200,51 +200,51 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
/** Read the channel number */
|
||||
/** Read the channel number */
|
||||
int channel() {
|
||||
return (data[1] & 0x0F);
|
||||
}
|
||||
|
||||
/** Read the key ID */
|
||||
|
||||
/** Read the key ID */
|
||||
int key() {
|
||||
return (data[2] & 0x7F);
|
||||
}
|
||||
|
||||
/** Read the velocity */
|
||||
int velocity() {
|
||||
return (data[3] & 0x7F);
|
||||
return (data[2] & 0x7F);
|
||||
}
|
||||
|
||||
/** Read the controller value */
|
||||
int value() {
|
||||
return (data[3] & 0x7F);
|
||||
/** Read the velocity */
|
||||
int velocity() {
|
||||
return (data[3] & 0x7F);
|
||||
}
|
||||
|
||||
/** Read the aftertouch pressure */
|
||||
|
||||
/** Read the controller value */
|
||||
int value() {
|
||||
return (data[3] & 0x7F);
|
||||
}
|
||||
|
||||
/** Read the aftertouch pressure */
|
||||
int pressure() {
|
||||
if(type() == PolyphonicAftertouchType) {
|
||||
return (data[3] & 0x7F);
|
||||
return (data[3] & 0x7F);
|
||||
} else {
|
||||
return (data[2] & 0x7F);
|
||||
return (data[2] & 0x7F);
|
||||
}
|
||||
}
|
||||
|
||||
/** Read the controller number */
|
||||
/** Read the controller number */
|
||||
int controller() {
|
||||
return (data[2] & 0x7F);
|
||||
return (data[2] & 0x7F);
|
||||
}
|
||||
|
||||
/** Read the program number */
|
||||
/** Read the program number */
|
||||
int program() {
|
||||
return (data[2] & 0x7F);
|
||||
return (data[2] & 0x7F);
|
||||
}
|
||||
|
||||
/** Read the pitch value */
|
||||
|
||||
/** 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[4];
|
||||
};
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#define DEFAULT_CONFIGURATION (1)
|
||||
|
||||
/**
|
||||
/**
|
||||
* USBMIDI example
|
||||
*
|
||||
* @code
|
||||
|
@ -38,8 +38,8 @@
|
|||
*
|
||||
* USBMIDI midi;
|
||||
*
|
||||
* int main() {
|
||||
* while (1) {
|
||||
* int main() {
|
||||
* while (1) {
|
||||
* for(int i=48; i<83; i++) { // send some messages!
|
||||
* midi.write(MIDIMessage::NoteOn(i));
|
||||
* wait(0.25);
|
||||
|
@ -61,12 +61,12 @@ public:
|
|||
* @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);
|
||||
|
||||
/**
|
||||
|
@ -75,8 +75,8 @@ public:
|
|||
* @param fptr function pointer
|
||||
*/
|
||||
void attach(void (*fptr)(MIDIMessage));
|
||||
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
virtual bool EP2_OUT_callback();
|
||||
virtual bool USBCallback_setConfiguration(uint8_t configuration);
|
||||
|
@ -86,14 +86,14 @@ protected:
|
|||
* @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
|
||||
*
|
||||
|
|
|
@ -79,7 +79,7 @@ public:
|
|||
* Disconnect the USB MSD device.
|
||||
*/
|
||||
void disconnect();
|
||||
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
*/
|
||||
|
|
|
@ -73,15 +73,15 @@ void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
|
|||
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);
|
||||
|
||||
memcpy(cdc_line_coding, buf, 7);
|
||||
|
||||
int baud = buf[0] + (buf[1] << 8)
|
||||
+ (buf[2] << 16) + (buf[3] << 24);
|
||||
int stop = buf[4];
|
||||
|
@ -186,7 +186,7 @@ uint8_t * USBCDC::configurationDesc() {
|
|||
0, // iConfiguration
|
||||
0x80, // bmAttributes
|
||||
50, // bMaxPower
|
||||
|
||||
|
||||
// IAD to associate the two CDC interfaces
|
||||
0x08, // bLength
|
||||
0x0b, // bDescriptorType
|
||||
|
|
|
@ -40,35 +40,35 @@ public:
|
|||
USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking);
|
||||
|
||||
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
|
||||
*
|
||||
|
@ -78,7 +78,7 @@ protected:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool send(uint8_t * buffer, uint32_t size);
|
||||
|
||||
|
||||
/*
|
||||
* Read a buffer from a certain endpoint. Warning: blocking
|
||||
*
|
||||
|
@ -89,7 +89,7 @@ protected:
|
|||
* @returns true if successful
|
||||
*/
|
||||
bool readEP(uint8_t * buffer, uint32_t * size);
|
||||
|
||||
|
||||
/*
|
||||
* Read a buffer from a certain endpoint. Warning: non blocking
|
||||
*
|
||||
|
@ -111,7 +111,7 @@ protected:
|
|||
* @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);
|
||||
|
|
|
@ -68,20 +68,20 @@ public:
|
|||
* @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();
|
||||
uint8_t available();
|
||||
|
||||
/** Determine if there is a character available to read
|
||||
*
|
||||
|
@ -90,7 +90,7 @@ public:
|
|||
* 0 otherwise
|
||||
*/
|
||||
int readable() { return available() ? 1 : 0; }
|
||||
|
||||
|
||||
/** Determine if there is space available to write a character
|
||||
*
|
||||
* @returns
|
||||
|
@ -98,9 +98,9 @@ public:
|
|||
* 0 otherwise
|
||||
*/
|
||||
int writeable() { return 1; } // always return 1, for write operation is blocking
|
||||
|
||||
|
||||
/**
|
||||
* Write a block of data.
|
||||
* Write a block of data.
|
||||
*
|
||||
* For more efficiency, a block of size 64 (maximum size of a bulk endpoint) has to be written.
|
||||
*
|
||||
|
@ -112,7 +112,7 @@ public:
|
|||
bool writeBlock(uint8_t * buf, uint16_t size);
|
||||
|
||||
/**
|
||||
* Attach a member function to call when a packet is received.
|
||||
* 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
|
||||
|
|
Loading…
Reference in New Issue