mirror of https://github.com/ARMmbed/mbed-os.git
Merge branch 'dev_trailing_spaces_removal' of git://github.com/0xc0170/mbed into 0xc0170-dev_trailing_spaces_removal
Conflicts: workspace_tools/toolchains/__init__.py workspace_tools/toolchains/arm.pypull/344/head
commit
bb120221fb
|
@ -60,3 +60,6 @@ debug.log
|
||||||
|
|
||||||
# Ignore OS X Desktop Services Store files
|
# Ignore OS X Desktop Services Store files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
# Orig diff files
|
||||||
|
*.orig
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
*
|
*
|
||||||
* int main() {
|
* int main() {
|
||||||
* int16_t buf[AUDIO_LENGTH_PACKET/2];
|
* int16_t buf[AUDIO_LENGTH_PACKET/2];
|
||||||
*
|
*
|
||||||
* while (1) {
|
* while (1) {
|
||||||
* // read an audio packet
|
* // read an audio packet
|
||||||
* audio.read((uint8_t *)buf);
|
* audio.read((uint8_t *)buf);
|
||||||
|
@ -88,7 +88,7 @@ public:
|
||||||
* @returns volume
|
* @returns volume
|
||||||
*/
|
*/
|
||||||
float getVolume();
|
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
|
* 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
|
* @returns true if successfull
|
||||||
*/
|
*/
|
||||||
bool read(uint8_t * buf);
|
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
|
* 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
|
* @returns true if successfull
|
||||||
*/
|
*/
|
||||||
bool readNB(uint8_t * buf);
|
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.
|
* 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
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool write(uint8_t * buf);
|
bool write(uint8_t * buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write and read an audio packet at the same time (on the same frame)
|
* Write and read an audio packet at the same time (on the same frame)
|
||||||
*
|
*
|
||||||
|
@ -123,7 +123,7 @@ public:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool readWrite(uint8_t * buf_read, uint8_t * buf_write);
|
bool readWrite(uint8_t * buf_read, uint8_t * buf_write);
|
||||||
|
|
||||||
|
|
||||||
/** attach a handler to update the volume
|
/** attach a handler to update the volume
|
||||||
*
|
*
|
||||||
|
@ -212,12 +212,12 @@ protected:
|
||||||
* Callback called on each Start of Frame event
|
* Callback called on each Start of Frame event
|
||||||
*/
|
*/
|
||||||
virtual void SOF(int frameNumber);
|
virtual void SOF(int frameNumber);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Callback called when a packet is received
|
* Callback called when a packet is received
|
||||||
*/
|
*/
|
||||||
virtual bool EP3_OUT_callback();
|
virtual bool EP3_OUT_callback();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Callback called when a packet has been sent
|
* Callback called when a packet has been sent
|
||||||
*/
|
*/
|
||||||
|
@ -227,13 +227,13 @@ private:
|
||||||
|
|
||||||
// stream available ?
|
// stream available ?
|
||||||
volatile bool available;
|
volatile bool available;
|
||||||
|
|
||||||
// interrupt OUT has been received
|
// interrupt OUT has been received
|
||||||
volatile bool interruptOUT;
|
volatile bool interruptOUT;
|
||||||
|
|
||||||
// interrupt IN has been received
|
// interrupt IN has been received
|
||||||
volatile bool interruptIN;
|
volatile bool interruptIN;
|
||||||
|
|
||||||
// audio packet has been written
|
// audio packet has been written
|
||||||
volatile bool writeIN;
|
volatile bool writeIN;
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ private:
|
||||||
// mono, stereo,...
|
// mono, stereo,...
|
||||||
uint8_t channel_nb_in;
|
uint8_t channel_nb_in;
|
||||||
uint8_t channel_nb_out;
|
uint8_t channel_nb_out;
|
||||||
|
|
||||||
// channel config: master, left, right
|
// channel config: master, left, right
|
||||||
uint8_t channel_config_in;
|
uint8_t channel_config_in;
|
||||||
uint8_t channel_config_out;
|
uint8_t channel_config_out;
|
||||||
|
@ -270,16 +270,16 @@ private:
|
||||||
|
|
||||||
// Buffer containing one audio packet (to be read)
|
// Buffer containing one audio packet (to be read)
|
||||||
volatile uint8_t * buf_stream_in;
|
volatile uint8_t * buf_stream_in;
|
||||||
|
|
||||||
// Buffer containing one audio packet (to be written)
|
// Buffer containing one audio packet (to be written)
|
||||||
volatile uint8_t * buf_stream_out;
|
volatile uint8_t * buf_stream_out;
|
||||||
|
|
||||||
// callback to update volume
|
// callback to update volume
|
||||||
FunctionPointer updateVol;
|
FunctionPointer updateVol;
|
||||||
|
|
||||||
// boolean showing that the SOF handler has been called. Useful for readNB.
|
// boolean showing that the SOF handler has been called. Useful for readNB.
|
||||||
volatile bool SOF_handler;
|
volatile bool SOF_handler;
|
||||||
|
|
||||||
volatile float volume;
|
volatile float volume;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
|
|
||||||
/*string offset*/
|
/*string offset*/
|
||||||
#define STRING_OFFSET_LANGID (0)
|
#define STRING_OFFSET_LANGID (0)
|
||||||
#define STRING_OFFSET_IMANUFACTURER (1)
|
#define STRING_OFFSET_IMANUFACTURER (1)
|
||||||
#define STRING_OFFSET_IPRODUCT (2)
|
#define STRING_OFFSET_IPRODUCT (2)
|
||||||
#define STRING_OFFSET_ISERIAL (3)
|
#define STRING_OFFSET_ISERIAL (3)
|
||||||
|
|
|
@ -106,7 +106,7 @@ bool USBDevice::requestGetDescriptor(void)
|
||||||
transfer.ptr = stringImanufacturerDesc();
|
transfer.ptr = stringImanufacturerDesc();
|
||||||
transfer.direction = DEVICE_TO_HOST;
|
transfer.direction = DEVICE_TO_HOST;
|
||||||
success = true;
|
success = true;
|
||||||
break;
|
break;
|
||||||
case STRING_OFFSET_IPRODUCT:
|
case STRING_OFFSET_IPRODUCT:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("3\r\n");
|
printf("3\r\n");
|
||||||
|
@ -115,7 +115,7 @@ bool USBDevice::requestGetDescriptor(void)
|
||||||
transfer.ptr = stringIproductDesc();
|
transfer.ptr = stringIproductDesc();
|
||||||
transfer.direction = DEVICE_TO_HOST;
|
transfer.direction = DEVICE_TO_HOST;
|
||||||
success = true;
|
success = true;
|
||||||
break;
|
break;
|
||||||
case STRING_OFFSET_ISERIAL:
|
case STRING_OFFSET_ISERIAL:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("4\r\n");
|
printf("4\r\n");
|
||||||
|
@ -124,7 +124,7 @@ bool USBDevice::requestGetDescriptor(void)
|
||||||
transfer.ptr = stringIserialDesc();
|
transfer.ptr = stringIserialDesc();
|
||||||
transfer.direction = DEVICE_TO_HOST;
|
transfer.direction = DEVICE_TO_HOST;
|
||||||
success = true;
|
success = true;
|
||||||
break;
|
break;
|
||||||
case STRING_OFFSET_ICONFIGURATION:
|
case STRING_OFFSET_ICONFIGURATION:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("5\r\n");
|
printf("5\r\n");
|
||||||
|
@ -133,7 +133,7 @@ bool USBDevice::requestGetDescriptor(void)
|
||||||
transfer.ptr = stringIConfigurationDesc();
|
transfer.ptr = stringIConfigurationDesc();
|
||||||
transfer.direction = DEVICE_TO_HOST;
|
transfer.direction = DEVICE_TO_HOST;
|
||||||
success = true;
|
success = true;
|
||||||
break;
|
break;
|
||||||
case STRING_OFFSET_IINTERFACE:
|
case STRING_OFFSET_IINTERFACE:
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("6\r\n");
|
printf("6\r\n");
|
||||||
|
@ -142,7 +142,7 @@ bool USBDevice::requestGetDescriptor(void)
|
||||||
transfer.ptr = stringIinterfaceDesc();
|
transfer.ptr = stringIinterfaceDesc();
|
||||||
transfer.direction = DEVICE_TO_HOST;
|
transfer.direction = DEVICE_TO_HOST;
|
||||||
success = true;
|
success = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case INTERFACE_DESCRIPTOR:
|
case INTERFACE_DESCRIPTOR:
|
||||||
|
@ -357,7 +357,7 @@ bool USBDevice::requestSetInterface(void)
|
||||||
{
|
{
|
||||||
success = true;
|
success = true;
|
||||||
currentInterface = transfer.setup.wIndex;
|
currentInterface = transfer.setup.wIndex;
|
||||||
currentAlternate = transfer.setup.wValue;
|
currentAlternate = transfer.setup.wValue;
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
@ -473,12 +473,12 @@ bool USBDevice::requestGetStatus(void)
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
/* Send the status */
|
/* Send the status */
|
||||||
transfer.ptr = (uint8_t *)&status; /* Assumes little endian */
|
transfer.ptr = (uint8_t *)&status; /* Assumes little endian */
|
||||||
transfer.remaining = sizeof(status);
|
transfer.remaining = sizeof(status);
|
||||||
transfer.direction = DEVICE_TO_HOST;
|
transfer.direction = DEVICE_TO_HOST;
|
||||||
}
|
}
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,7 +546,7 @@ bool USBDevice::controlSetup(void)
|
||||||
transfer.direction = 0;
|
transfer.direction = 0;
|
||||||
transfer.zlp = false;
|
transfer.zlp = false;
|
||||||
transfer.notify = false;
|
transfer.notify = false;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#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,
|
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.Type,
|
||||||
|
@ -593,7 +593,7 @@ bool USBDevice::controlSetup(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* OUT data stage is required */
|
/* OUT data stage is required */
|
||||||
if (transfer.direction != HOST_TO_DEVICE)
|
if (transfer.direction != HOST_TO_DEVICE)
|
||||||
{
|
{
|
||||||
|
@ -707,7 +707,7 @@ void USBDevice::connect(bool blocking)
|
||||||
{
|
{
|
||||||
/* Connect device */
|
/* Connect device */
|
||||||
USBHAL::connect();
|
USBHAL::connect();
|
||||||
|
|
||||||
if (blocking) {
|
if (blocking) {
|
||||||
/* Block if not configured */
|
/* Block if not configured */
|
||||||
while (!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){
|
USBDevice::USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release){
|
||||||
VENDOR_ID = vendor_id;
|
VENDOR_ID = vendor_id;
|
||||||
PRODUCT_ID = product_id;
|
PRODUCT_ID = product_id;
|
||||||
PRODUCT_RELEASE = product_release;
|
PRODUCT_RELEASE = product_release;
|
||||||
|
|
||||||
/* Set initial device state */
|
/* Set initial device state */
|
||||||
|
@ -818,12 +818,12 @@ bool USBDevice::write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!configured()) {
|
if(!configured()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send report */
|
/* Send report */
|
||||||
result = endpointWrite(endpoint, buffer, size);
|
result = endpointWrite(endpoint, buffer, size);
|
||||||
|
|
||||||
|
@ -849,7 +849,7 @@ bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint3
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!configured()) {
|
if(!configured()) {
|
||||||
return false;
|
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)
|
bool USBDevice::readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
|
||||||
{
|
{
|
||||||
EP_STATUS result;
|
EP_STATUS result;
|
||||||
|
|
||||||
if(!configured()) {
|
if(!configured()) {
|
||||||
return false;
|
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)
|
bool USBDevice::readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize)
|
||||||
{
|
{
|
||||||
EP_STATUS result;
|
EP_STATUS result;
|
||||||
|
|
||||||
if(!configured()) {
|
if(!configured()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = endpointReadResult(endpoint, buffer, size);
|
result = endpointReadResult(endpoint, buffer, size);
|
||||||
|
|
||||||
return (result == EP_COMPLETED);
|
return (result == EP_COMPLETED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,26 +27,26 @@ class USBDevice: public USBHAL
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);
|
USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if the device is configured
|
* Check if the device is configured
|
||||||
*
|
*
|
||||||
* @returns true if configured, false otherwise
|
* @returns true if configured, false otherwise
|
||||||
*/
|
*/
|
||||||
bool configured(void);
|
bool configured(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Connect a device
|
* Connect a device
|
||||||
*
|
*
|
||||||
* @param blocking: block if not configured
|
* @param blocking: block if not configured
|
||||||
*/
|
*/
|
||||||
void connect(bool blocking = true);
|
void connect(bool blocking = true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disconnect a device
|
* Disconnect a device
|
||||||
*/
|
*/
|
||||||
void disconnect(void);
|
void disconnect(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add an endpoint
|
* Add an endpoint
|
||||||
*
|
*
|
||||||
|
@ -65,7 +65,7 @@ public:
|
||||||
* @return true if successful
|
* @return true if successful
|
||||||
*/
|
*/
|
||||||
bool readStart(uint8_t endpoint, uint32_t maxSize);
|
bool readStart(uint8_t endpoint, uint32_t maxSize);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read a certain endpoint. Before calling this function, USBUSBDevice_readStart
|
* Read a certain endpoint. Before calling this function, USBUSBDevice_readStart
|
||||||
* must be called.
|
* must be called.
|
||||||
|
@ -79,20 +79,20 @@ public:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
|
bool readEP(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read a certain endpoint.
|
* Read a certain endpoint.
|
||||||
*
|
*
|
||||||
* Warning: non blocking
|
* Warning: non blocking
|
||||||
*
|
*
|
||||||
* @param endpoint endpoint which will be read
|
* @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 size the number of bytes read will be stored in *size
|
||||||
* @param maxSize the maximum length that can be read
|
* @param maxSize the maximum length that can be read
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
|
bool readEP_NB(uint8_t endpoint, uint8_t * buffer, uint32_t * size, uint32_t maxSize);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write a certain endpoint.
|
* Write a certain endpoint.
|
||||||
*
|
*
|
||||||
|
@ -104,8 +104,8 @@ public:
|
||||||
* @param maxSize the maximum length that can be written on this endpoint
|
* @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);
|
bool write(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write a certain endpoint.
|
* Write a certain endpoint.
|
||||||
*
|
*
|
||||||
|
@ -118,14 +118,14 @@ public:
|
||||||
*/
|
*/
|
||||||
bool writeNB(uint8_t endpoint, uint8_t * buffer, uint32_t size, uint32_t maxSize);
|
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
|
* Called by USBDevice layer on bus reset. Warning: Called in ISR context
|
||||||
*
|
*
|
||||||
* May be used to reset state
|
* May be used to reset state
|
||||||
*/
|
*/
|
||||||
virtual void USBCallback_busReset(void) {};
|
virtual void USBCallback_busReset(void) {};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
|
* Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
|
||||||
* This is used to handle extensions to standard requests
|
* This is used to handle extensions to standard requests
|
||||||
|
@ -133,8 +133,8 @@ public:
|
||||||
*
|
*
|
||||||
* @returns true if class handles this request
|
* @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
|
* Called by USBDevice on Endpoint0 request completion
|
||||||
* if the 'notify' flag has been set to true. Warning: Called in ISR context
|
* 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
|
* @param length length of this buffer
|
||||||
*/
|
*/
|
||||||
virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {};
|
virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called by USBDevice layer. Set configuration of the device.
|
* Called by USBDevice layer. Set configuration of the device.
|
||||||
* For instance, you can add all endpoints that you need on this function.
|
* For instance, you can add all endpoints that you need on this function.
|
||||||
|
@ -154,7 +154,7 @@ public:
|
||||||
* @param configuration Number of the configuration
|
* @param configuration Number of the configuration
|
||||||
*/
|
*/
|
||||||
virtual bool USBCallback_setConfiguration(uint8_t configuration) { return false; };
|
virtual bool USBCallback_setConfiguration(uint8_t configuration) { return false; };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called by USBDevice layer. Set interface/alternate of the device.
|
* Called by USBDevice layer. Set interface/alternate of the device.
|
||||||
*
|
*
|
||||||
|
@ -170,63 +170,63 @@ public:
|
||||||
* @returns pointer to the device descriptor
|
* @returns pointer to the device descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * deviceDesc();
|
virtual uint8_t * deviceDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get configuration descriptor
|
* Get configuration descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the configuration descriptor
|
* @returns pointer to the configuration descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * configurationDesc(){return NULL;};
|
virtual uint8_t * configurationDesc(){return NULL;};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string lang id descriptor
|
* Get string lang id descriptor
|
||||||
*
|
*
|
||||||
* @return pointer to the string lang id descriptor
|
* @return pointer to the string lang id descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringLangidDesc();
|
virtual uint8_t * stringLangidDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string manufacturer descriptor
|
* Get string manufacturer descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string manufacturer descriptor
|
* @returns pointer to the string manufacturer descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringImanufacturerDesc();
|
virtual uint8_t * stringImanufacturerDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string product descriptor
|
* Get string product descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string product descriptor
|
* @returns pointer to the string product descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIproductDesc();
|
virtual uint8_t * stringIproductDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string serial descriptor
|
* Get string serial descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string serial descriptor
|
* @returns pointer to the string serial descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIserialDesc();
|
virtual uint8_t * stringIserialDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string configuration descriptor
|
* Get string configuration descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string configuration descriptor
|
* @returns pointer to the string configuration descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIConfigurationDesc();
|
virtual uint8_t * stringIConfigurationDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string interface descriptor
|
* Get string interface descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string interface descriptor
|
* @returns pointer to the string interface descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIinterfaceDesc();
|
virtual uint8_t * stringIinterfaceDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the length of the report descriptor
|
* Get the length of the report descriptor
|
||||||
*
|
*
|
||||||
* @returns length of the report descriptor
|
* @returns length of the report descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint16_t reportDescLength() { return 0; };
|
virtual uint16_t reportDescLength() { return 0; };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -238,7 +238,7 @@ protected:
|
||||||
virtual void suspendStateChanged(unsigned int suspended);
|
virtual void suspendStateChanged(unsigned int suspended);
|
||||||
uint8_t * findDescriptor(uint8_t descriptorType);
|
uint8_t * findDescriptor(uint8_t descriptorType);
|
||||||
CONTROL_TRANSFER * getTransferPtr(void);
|
CONTROL_TRANSFER * getTransferPtr(void);
|
||||||
|
|
||||||
uint16_t VENDOR_ID;
|
uint16_t VENDOR_ID;
|
||||||
uint16_t PRODUCT_ID;
|
uint16_t PRODUCT_ID;
|
||||||
uint16_t PRODUCT_RELEASE;
|
uint16_t PRODUCT_RELEASE;
|
||||||
|
@ -262,7 +262,7 @@ private:
|
||||||
|
|
||||||
CONTROL_TRANSFER transfer;
|
CONTROL_TRANSFER transfer;
|
||||||
USB_DEVICE device;
|
USB_DEVICE device;
|
||||||
|
|
||||||
uint16_t currentInterface;
|
uint16_t currentInterface;
|
||||||
uint8_t currentAlternate;
|
uint8_t currentAlternate;
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,38 +23,38 @@
|
||||||
|
|
||||||
/* Endpoint No. */
|
/* Endpoint No. */
|
||||||
/* ---------------- */
|
/* ---------------- */
|
||||||
#define EP0OUT (0)
|
#define EP0OUT (0)
|
||||||
#define EP0IN (1)
|
#define EP0IN (1)
|
||||||
#define EP1OUT (2)
|
#define EP1OUT (2)
|
||||||
#define EP1IN (3)
|
#define EP1IN (3)
|
||||||
#define EP2OUT (4)
|
#define EP2OUT (4)
|
||||||
#define EP2IN (5)
|
#define EP2IN (5)
|
||||||
#define EP3OUT (6)
|
#define EP3OUT (6)
|
||||||
#define EP3IN (7)
|
#define EP3IN (7)
|
||||||
#define EP4OUT (8)
|
#define EP4OUT (8)
|
||||||
#define EP4IN (9)
|
#define EP4IN (9)
|
||||||
#define EP5OUT (10)
|
#define EP5OUT (10)
|
||||||
#define EP5IN (11)
|
#define EP5IN (11)
|
||||||
#define EP6OUT (12)
|
#define EP6OUT (12)
|
||||||
#define EP6IN (13)
|
#define EP6IN (13)
|
||||||
#define EP7OUT (14)
|
#define EP7OUT (14)
|
||||||
#define EP7IN (15)
|
#define EP7IN (15)
|
||||||
#define EP8OUT (16)
|
#define EP8OUT (16)
|
||||||
#define EP8IN (17)
|
#define EP8IN (17)
|
||||||
#define EP9OUT (18)
|
#define EP9OUT (18)
|
||||||
#define EP9IN (19)
|
#define EP9IN (19)
|
||||||
#define EP10OUT (20)
|
#define EP10OUT (20)
|
||||||
#define EP10IN (21)
|
#define EP10IN (21)
|
||||||
#define EP11OUT (22)
|
#define EP11OUT (22)
|
||||||
#define EP11IN (23)
|
#define EP11IN (23)
|
||||||
#define EP12OUT (24)
|
#define EP12OUT (24)
|
||||||
#define EP12IN (25)
|
#define EP12IN (25)
|
||||||
#define EP13OUT (26)
|
#define EP13OUT (26)
|
||||||
#define EP13IN (27)
|
#define EP13IN (27)
|
||||||
#define EP14OUT (28)
|
#define EP14OUT (28)
|
||||||
#define EP14IN (29)
|
#define EP14IN (29)
|
||||||
#define EP15OUT (30)
|
#define EP15OUT (30)
|
||||||
#define EP15IN (31)
|
#define EP15IN (31)
|
||||||
|
|
||||||
/* Maximum Packet sizes */
|
/* Maximum Packet sizes */
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ public:
|
||||||
bool realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options);
|
bool realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options);
|
||||||
bool getEndpointStallState(unsigned char endpoint);
|
bool getEndpointStallState(unsigned char endpoint);
|
||||||
uint32_t endpointReadcore(uint8_t endpoint, uint8_t *buffer);
|
uint32_t endpointReadcore(uint8_t endpoint, uint8_t *buffer);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void busReset(void){};
|
virtual void busReset(void){};
|
||||||
virtual void EP0setupCallback(void){};
|
virtual void EP0setupCallback(void){};
|
||||||
|
@ -67,7 +67,7 @@ protected:
|
||||||
virtual void connectStateChanged(unsigned int connected){};
|
virtual void connectStateChanged(unsigned int connected){};
|
||||||
virtual void suspendStateChanged(unsigned int suspended){};
|
virtual void suspendStateChanged(unsigned int suspended){};
|
||||||
virtual void SOF(int frameNumber){};
|
virtual void SOF(int frameNumber){};
|
||||||
|
|
||||||
virtual bool EP1_OUT_callback(){return false;};
|
virtual bool EP1_OUT_callback(){return false;};
|
||||||
virtual bool EP1_IN_callback(){return false;};
|
virtual bool EP1_IN_callback(){return false;};
|
||||||
virtual bool EP2_OUT_callback(){return false;};
|
virtual bool EP2_OUT_callback(){return false;};
|
||||||
|
@ -102,7 +102,7 @@ protected:
|
||||||
virtual bool EP15_IN_callback(){return false;};
|
virtual bool EP15_IN_callback(){return false;};
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void usbisr(void);
|
void usbisr(void);
|
||||||
static void _usbisr(void);
|
static void _usbisr(void);
|
||||||
|
@ -116,6 +116,6 @@ private:
|
||||||
bool (USBHAL::*epCallback[32 - 2])(void);
|
bool (USBHAL::*epCallback[32 - 2])(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -134,7 +134,7 @@ void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size) {
|
||||||
|
|
||||||
USBHAL::USBHAL(void) {
|
USBHAL::USBHAL(void) {
|
||||||
NVIC_DisableIRQ(USB_IRQ);
|
NVIC_DisableIRQ(USB_IRQ);
|
||||||
|
|
||||||
// fill in callback array
|
// fill in callback array
|
||||||
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
||||||
epCallback[1] = &USBHAL::EP1_IN_callback;
|
epCallback[1] = &USBHAL::EP1_IN_callback;
|
||||||
|
@ -149,7 +149,7 @@ USBHAL::USBHAL(void) {
|
||||||
// USB_VBUS input with pull-down
|
// USB_VBUS input with pull-down
|
||||||
LPC_IOCON->PIO0_3 = 0x00000009;
|
LPC_IOCON->PIO0_3 = 0x00000009;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// nUSB_CONNECT output
|
// nUSB_CONNECT output
|
||||||
LPC_IOCON->PIO0_6 = 0x00000001;
|
LPC_IOCON->PIO0_6 = 0x00000001;
|
||||||
|
|
||||||
|
@ -287,13 +287,13 @@ EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
|
||||||
bf = 0;
|
bf = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if isochronous endpoint, T = 1
|
// if isochronous endpoint, T = 1
|
||||||
if(endpointState[endpoint].options & ISOCHRONOUS)
|
if(endpointState[endpoint].options & ISOCHRONOUS)
|
||||||
{
|
{
|
||||||
flags |= CMDSTS_T;
|
flags |= CMDSTS_T;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Active the endpoint for reading
|
//Active the endpoint for reading
|
||||||
ep[PHY_TO_LOG(endpoint)].out[bf] = CMDSTS_A | CMDSTS_NBYTES(maximumSize) \
|
ep[PHY_TO_LOG(endpoint)].out[bf] = CMDSTS_A | CMDSTS_NBYTES(maximumSize) \
|
||||||
| CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out) | flags;
|
| 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) {
|
EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
|
||||||
uint32_t bf;
|
uint32_t bf;
|
||||||
|
|
||||||
// Validate parameters
|
// Validate parameters
|
||||||
if (endpoint > LAST_PHYSICAL_ENDPOINT) {
|
if (endpoint > LAST_PHYSICAL_ENDPOINT) {
|
||||||
return EP_INVALID;
|
return EP_INVALID;
|
||||||
|
@ -680,7 +680,7 @@ void USBHAL::usbisr(void) {
|
||||||
// EP0IN ACK event (IN data sent)
|
// EP0IN ACK event (IN data sent)
|
||||||
EP0in();
|
EP0in();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t num = 2; num < 5*2; num++) {
|
for (uint8_t num = 2; num < 5*2; num++) {
|
||||||
if (LPC_USB->INTSTAT & EP(num)) {
|
if (LPC_USB->INTSTAT & EP(num)) {
|
||||||
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);
|
SIEselectEndpoint(endpoint);
|
||||||
SIEclearBuffer();
|
SIEclearBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +327,7 @@ static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size)
|
||||||
USBHAL::USBHAL(void) {
|
USBHAL::USBHAL(void) {
|
||||||
// Disable IRQ
|
// Disable IRQ
|
||||||
NVIC_DisableIRQ(USB_IRQn);
|
NVIC_DisableIRQ(USB_IRQn);
|
||||||
|
|
||||||
// fill in callback array
|
// fill in callback array
|
||||||
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
||||||
epCallback[1] = &USBHAL::EP1_IN_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)))
|
if (!(epComplete & EP(endpoint)))
|
||||||
return EP_PENDING;
|
return EP_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
*bytesRead = endpointReadcore(endpoint, buffer);
|
*bytesRead = endpointReadcore(endpoint, buffer);
|
||||||
epComplete &= ~EP(endpoint);
|
epComplete &= ~EP(endpoint);
|
||||||
return EP_COMPLETED;
|
return EP_COMPLETED;
|
||||||
|
@ -606,7 +606,7 @@ void USBHAL::usbisr(void) {
|
||||||
LPC_USB->USBDevIntClr = EP_SLOW;
|
LPC_USB->USBDevIntClr = EP_SLOW;
|
||||||
EP0in();
|
EP0in();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t num = 2; num < 16*2; num++) {
|
for (uint8_t num = 2; num < 16*2; num++) {
|
||||||
if (LPC_USB->USBEpIntSt & EP(num)) {
|
if (LPC_USB->USBEpIntSt & EP(num)) {
|
||||||
selectEndpointClearInterrupt(num);
|
selectEndpointClearInterrupt(num);
|
||||||
|
|
|
@ -280,7 +280,7 @@ uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
|
||||||
SIEselectEndpoint(endpoint);
|
SIEselectEndpoint(endpoint);
|
||||||
SIEclearBuffer();
|
SIEclearBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size)
|
||||||
USBHAL::USBHAL(void) {
|
USBHAL::USBHAL(void) {
|
||||||
// Disable IRQ
|
// Disable IRQ
|
||||||
NVIC_DisableIRQ(USB_IRQn);
|
NVIC_DisableIRQ(USB_IRQn);
|
||||||
|
|
||||||
// fill in callback array
|
// fill in callback array
|
||||||
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
||||||
epCallback[1] = &USBHAL::EP1_IN_callback;
|
epCallback[1] = &USBHAL::EP1_IN_callback;
|
||||||
|
@ -367,7 +367,7 @@ USBHAL::USBHAL(void) {
|
||||||
// Enable USB clocks
|
// Enable USB clocks
|
||||||
LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN | PORT_CLK_EN;
|
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));
|
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
|
// Select port USB2
|
||||||
LPC_USB->StCtrl |= 3;
|
LPC_USB->StCtrl |= 3;
|
||||||
|
|
||||||
|
@ -375,13 +375,13 @@ USBHAL::USBHAL(void) {
|
||||||
// Configure pin P0.31 to be USB2
|
// Configure pin P0.31 to be USB2
|
||||||
LPC_IOCON->P0_31 &= ~0x07;
|
LPC_IOCON->P0_31 &= ~0x07;
|
||||||
LPC_IOCON->P0_31 |= 0x01;
|
LPC_IOCON->P0_31 |= 0x01;
|
||||||
|
|
||||||
// Disconnect USB device
|
// Disconnect USB device
|
||||||
SIEdisconnect();
|
SIEdisconnect();
|
||||||
|
|
||||||
// Configure pin P0.14 to be Connect
|
// Configure pin P0.14 to be Connect
|
||||||
LPC_IOCON->P0_14 &= ~0x07;
|
LPC_IOCON->P0_14 &= ~0x07;
|
||||||
LPC_IOCON->P0_14 |= 0x03;
|
LPC_IOCON->P0_14 |= 0x03;
|
||||||
|
|
||||||
// Connect must be low for at least 2.5uS
|
// Connect must be low for at least 2.5uS
|
||||||
wait(0.3);
|
wait(0.3);
|
||||||
|
@ -471,7 +471,7 @@ EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_
|
||||||
if (!(epComplete & EP(endpoint)))
|
if (!(epComplete & EP(endpoint)))
|
||||||
return EP_PENDING;
|
return EP_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
*bytesRead = endpointReadcore(endpoint, buffer);
|
*bytesRead = endpointReadcore(endpoint, buffer);
|
||||||
epComplete &= ~EP(endpoint);
|
epComplete &= ~EP(endpoint);
|
||||||
return EP_COMPLETED;
|
return EP_COMPLETED;
|
||||||
|
@ -611,7 +611,7 @@ void USBHAL::usbisr(void) {
|
||||||
LPC_USB->DevIntClr = EP_SLOW;
|
LPC_USB->DevIntClr = EP_SLOW;
|
||||||
EP0in();
|
EP0in();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t num = 2; num < 16*2; num++) {
|
for (uint8_t num = 2; num < 16*2; num++) {
|
||||||
if (LPC_USB->EpIntSt & EP(num)) {
|
if (LPC_USB->EpIntSt & EP(num)) {
|
||||||
selectEndpointClearInterrupt(num);
|
selectEndpointClearInterrupt(num);
|
||||||
|
|
|
@ -36,7 +36,7 @@ uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
USBHAL::USBHAL(void) {
|
USBHAL::USBHAL(void) {
|
||||||
NVIC_DisableIRQ(OTG_FS_IRQn);
|
NVIC_DisableIRQ(OTG_FS_IRQn);
|
||||||
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
epCallback[0] = &USBHAL::EP1_OUT_callback;
|
||||||
epCallback[1] = &USBHAL::EP1_IN_callback;
|
epCallback[1] = &USBHAL::EP1_IN_callback;
|
||||||
|
@ -63,7 +63,7 @@ USBHAL::USBHAL(void) {
|
||||||
pin_mode(PA_9, OpenDrain);
|
pin_mode(PA_9, OpenDrain);
|
||||||
|
|
||||||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
||||||
|
|
||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
OTG_FS->GREGS.GAHBCFG |= (1 << 0);
|
OTG_FS->GREGS.GAHBCFG |= (1 << 0);
|
||||||
|
|
||||||
|
@ -116,21 +116,21 @@ bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
|
||||||
|
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
switch (endpoint) {
|
switch (endpoint) {
|
||||||
case EP0IN:
|
case EP0IN:
|
||||||
case EP0OUT:
|
case EP0OUT:
|
||||||
type = 0;
|
type = 0;
|
||||||
break;
|
break;
|
||||||
case EPISO_IN:
|
case EPISO_IN:
|
||||||
case EPISO_OUT:
|
case EPISO_OUT:
|
||||||
type = 1;
|
type = 1;
|
||||||
case EPBULK_IN:
|
case EPBULK_IN:
|
||||||
case EPBULK_OUT:
|
case EPBULK_OUT:
|
||||||
type = 2;
|
type = 2;
|
||||||
break;
|
break;
|
||||||
case EPINT_IN:
|
case EPINT_IN:
|
||||||
case EPINT_OUT:
|
case EPINT_OUT:
|
||||||
type = 3;
|
type = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic in or out EP controls
|
// Generic in or out EP controls
|
||||||
|
@ -154,7 +154,7 @@ bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket,
|
||||||
if (endpoint != EP0IN) {
|
if (endpoint != EP0IN) {
|
||||||
control |= (1 << 28); // SD0PID
|
control |= (1 << 28); // SD0PID
|
||||||
}
|
}
|
||||||
|
|
||||||
control |= (epIndex << 22) | // TxFIFO index
|
control |= (epIndex << 22) | // TxFIFO index
|
||||||
(1 << 27); // SNAK
|
(1 << 27); // SNAK
|
||||||
OTG_FS->INEP_REGS[epIndex].DIEPCTL = control;
|
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
|
// Set the out EP specific control settings
|
||||||
control |= (1 << 26); // CNAK
|
control |= (1 << 26); // CNAK
|
||||||
OTG_FS->OUTEP_REGS[epIndex].DOEPCTL = control;
|
OTG_FS->OUTEP_REGS[epIndex].DOEPCTL = control;
|
||||||
|
|
||||||
// Unmask the interrupt
|
// Unmask the interrupt
|
||||||
OTG_FS->DREGS.DAINTMSK |= (1 << (epIndex + 16));
|
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) {
|
for (uint32_t i = 0; i < length; i += 4) {
|
||||||
buffer32[i >> 2] = OTG_FS->FIFO[0][0];
|
buffer32[i >> 2] = OTG_FS->FIFO[0][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
rxFifoCount = 0;
|
rxFifoCount = 0;
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
|
||||||
return EP_COMPLETED;
|
return EP_COMPLETED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EP_PENDING;
|
return EP_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void USBHAL::stallEndpoint(uint8_t endpoint) {
|
void USBHAL::stallEndpoint(uint8_t endpoint) {
|
||||||
|
@ -282,7 +282,7 @@ void USBHAL::stallEndpoint(uint8_t endpoint) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void USBHAL::unstallEndpoint(uint8_t endpoint) {
|
void USBHAL::unstallEndpoint(uint8_t endpoint) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool USBHAL::getEndpointStallState(uint8_t endpoint) {
|
bool USBHAL::getEndpointStallState(uint8_t endpoint) {
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
*
|
*
|
||||||
* http://www.st.com/software_license_agreement_liberty_v2
|
* http://www.st.com/software_license_agreement_liberty_v2
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
|
@ -70,7 +70,7 @@ typedef struct // 800h
|
||||||
}
|
}
|
||||||
USB_OTG_DREGS;
|
USB_OTG_DREGS;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
__IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/
|
__IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/
|
||||||
uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/
|
uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/
|
||||||
|
@ -83,7 +83,7 @@ typedef struct
|
||||||
}
|
}
|
||||||
USB_OTG_INEPREGS;
|
USB_OTG_INEPREGS;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
__IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/
|
__IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/
|
||||||
uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/
|
uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/
|
||||||
|
@ -117,7 +117,7 @@ typedef struct
|
||||||
}
|
}
|
||||||
USB_OTG_HC_REGS;
|
USB_OTG_HC_REGS;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
USB_OTG_GREGS GREGS;
|
USB_OTG_GREGS GREGS;
|
||||||
uint32_t RESERVED0[188];
|
uint32_t RESERVED0[188];
|
||||||
|
|
|
@ -121,7 +121,7 @@ bool USBHID::USBCallback_request() {
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,8 +70,8 @@ public:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool send(HID_REPORT *report);
|
bool send(HID_REPORT *report);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a Report. warning: non blocking
|
* Send a Report. warning: non blocking
|
||||||
*
|
*
|
||||||
|
@ -79,7 +79,7 @@ public:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool sendNB(HID_REPORT *report);
|
bool sendNB(HID_REPORT *report);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a report: blocking
|
* Read a report: blocking
|
||||||
*
|
*
|
||||||
|
@ -87,7 +87,7 @@ public:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool read(HID_REPORT * report);
|
bool read(HID_REPORT * report);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a report: non blocking
|
* Read a report: non blocking
|
||||||
*
|
*
|
||||||
|
@ -98,7 +98,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint16_t reportLength;
|
uint16_t reportLength;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the Report descriptor
|
* Get the Report descriptor
|
||||||
*
|
*
|
||||||
|
@ -119,14 +119,14 @@ protected:
|
||||||
* @returns pointer to the string product descriptor
|
* @returns pointer to the string product descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIproductDesc();
|
virtual uint8_t * stringIproductDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string interface descriptor
|
* Get string interface descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string interface descriptor
|
* @returns pointer to the string interface descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIinterfaceDesc();
|
virtual uint8_t * stringIinterfaceDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get configuration descriptor
|
* Get configuration descriptor
|
||||||
*
|
*
|
||||||
|
|
|
@ -183,7 +183,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
||||||
{0x4a, 0}, /* HOME */
|
{0x4a, 0}, /* HOME */
|
||||||
{0x4b, 0}, /* PAGE_UP */
|
{0x4b, 0}, /* PAGE_UP */
|
||||||
{0x4e, 0}, /* PAGE_DOWN */
|
{0x4e, 0}, /* PAGE_DOWN */
|
||||||
|
|
||||||
{0x4f, 0}, /* RIGHT_ARROW */
|
{0x4f, 0}, /* RIGHT_ARROW */
|
||||||
{0x50, 0}, /* LEFT_ARROW */
|
{0x50, 0}, /* LEFT_ARROW */
|
||||||
{0x51, 0}, /* DOWN_ARROW */
|
{0x51, 0}, /* DOWN_ARROW */
|
||||||
|
@ -344,7 +344,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
||||||
{0x4a, 0}, /* HOME */
|
{0x4a, 0}, /* HOME */
|
||||||
{0x4b, 0}, /* PAGE_UP */
|
{0x4b, 0}, /* PAGE_UP */
|
||||||
{0x4e, 0}, /* PAGE_DOWN */
|
{0x4e, 0}, /* PAGE_DOWN */
|
||||||
|
|
||||||
{0x4f, 0}, /* RIGHT_ARROW */
|
{0x4f, 0}, /* RIGHT_ARROW */
|
||||||
{0x50, 0}, /* LEFT_ARROW */
|
{0x50, 0}, /* LEFT_ARROW */
|
||||||
{0x51, 0}, /* DOWN_ARROW */
|
{0x51, 0}, /* DOWN_ARROW */
|
||||||
|
@ -424,10 +424,10 @@ bool USBKeyboard::EP1_OUT_callback() {
|
||||||
uint32_t bytesRead = 0;
|
uint32_t bytesRead = 0;
|
||||||
uint8_t led[65];
|
uint8_t led[65];
|
||||||
USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
|
USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
|
||||||
|
|
||||||
// we take led[1] because led[0] is the report ID
|
// we take led[1] because led[0] is the report ID
|
||||||
lock_status = led[1] & 0x07;
|
lock_status = led[1] & 0x07;
|
||||||
|
|
||||||
// We activate the endpoint to be able to recceive data
|
// We activate the endpoint to be able to recceive data
|
||||||
if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
|
if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -53,7 +53,7 @@ enum FUNCTION_KEY {
|
||||||
KEY_F10, /* F10 key */
|
KEY_F10, /* F10 key */
|
||||||
KEY_F11, /* F11 key */
|
KEY_F11, /* F11 key */
|
||||||
KEY_F12, /* F12 key */
|
KEY_F12, /* F12 key */
|
||||||
|
|
||||||
KEY_PRINT_SCREEN, /* Print Screen key */
|
KEY_PRINT_SCREEN, /* Print Screen key */
|
||||||
KEY_SCROLL_LOCK, /* Scroll lock */
|
KEY_SCROLL_LOCK, /* Scroll lock */
|
||||||
KEY_CAPS_LOCK, /* caps lock */
|
KEY_CAPS_LOCK, /* caps lock */
|
||||||
|
@ -62,7 +62,7 @@ enum FUNCTION_KEY {
|
||||||
KEY_HOME, /* Home key */
|
KEY_HOME, /* Home key */
|
||||||
KEY_PAGE_UP, /* Page Up key */
|
KEY_PAGE_UP, /* Page Up key */
|
||||||
KEY_PAGE_DOWN, /* Page Down key */
|
KEY_PAGE_DOWN, /* Page Down key */
|
||||||
|
|
||||||
RIGHT_ARROW, /* Right arrow */
|
RIGHT_ARROW, /* Right arrow */
|
||||||
LEFT_ARROW, /* Left arrow */
|
LEFT_ARROW, /* Left arrow */
|
||||||
DOWN_ARROW, /* Down arrow */
|
DOWN_ARROW, /* Down arrow */
|
||||||
|
|
|
@ -35,7 +35,7 @@ enum MOUSE_BUTTON
|
||||||
/* X and Y limits */
|
/* X and Y limits */
|
||||||
/* These values do not directly map to screen pixels */
|
/* These values do not directly map to screen pixels */
|
||||||
/* Zero may be interpreted as meaning 'no movement' */
|
/* 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 Y_MIN_ABS (1) /*!< Minimum value on y-axis */
|
||||||
#define X_MAX_ABS (0x7fff) /*!< Maximum value on x-axis */
|
#define X_MAX_ABS (0x7fff) /*!< Maximum value on x-axis */
|
||||||
#define Y_MAX_ABS (0x7fff) /*!< Maximum value on y-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 y_center = (Y_MAX_ABS - Y_MIN_ABS)/2;
|
||||||
* uint16_t x_screen = 0;
|
* uint16_t x_screen = 0;
|
||||||
* uint16_t y_screen = 0;
|
* uint16_t y_screen = 0;
|
||||||
*
|
*
|
||||||
* uint32_t x_origin = x_center;
|
* uint32_t x_origin = x_center;
|
||||||
* uint32_t y_origin = y_center;
|
* uint32_t y_origin = y_center;
|
||||||
* uint32_t radius = 5000;
|
* uint32_t radius = 5000;
|
||||||
|
@ -95,7 +95,7 @@ enum MOUSE_TYPE
|
||||||
* {
|
* {
|
||||||
* x_screen = x_origin + cos((double)angle*3.14/180.0)*radius;
|
* x_screen = x_origin + cos((double)angle*3.14/180.0)*radius;
|
||||||
* y_screen = y_origin + sin((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);
|
* mouse.move(x_screen, y_screen);
|
||||||
* angle += 3;
|
* angle += 3;
|
||||||
* wait(0.01);
|
* wait(0.01);
|
||||||
|
@ -107,7 +107,7 @@ enum MOUSE_TYPE
|
||||||
class USBMouse: public USBHID
|
class USBMouse: public USBHID
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
|
@ -117,14 +117,14 @@ class USBMouse: public USBHID
|
||||||
* @param product_release Your preoduct_release (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):
|
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)
|
USBHID(0, 0, vendor_id, product_id, product_release, false)
|
||||||
{
|
{
|
||||||
button = 0;
|
button = 0;
|
||||||
this->mouse_type = mouse_type;
|
this->mouse_type = mouse_type;
|
||||||
connect();
|
connect();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a state of the mouse
|
* Write a state of the mouse
|
||||||
*
|
*
|
||||||
|
@ -135,8 +135,8 @@ class USBMouse: public USBHID
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
|
bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the cursor to (x, y)
|
* Move the cursor to (x, y)
|
||||||
*
|
*
|
||||||
|
@ -145,7 +145,7 @@ class USBMouse: public USBHID
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool move(int16_t x, int16_t y);
|
bool move(int16_t x, int16_t y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Press one or several buttons
|
* Press one or several buttons
|
||||||
*
|
*
|
||||||
|
@ -153,7 +153,7 @@ class USBMouse: public USBHID
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool press(uint8_t button);
|
bool press(uint8_t button);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release one or several buttons
|
* Release one or several buttons
|
||||||
*
|
*
|
||||||
|
@ -161,22 +161,22 @@ class USBMouse: public USBHID
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool release(uint8_t button);
|
bool release(uint8_t button);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Double click (MOUSE_LEFT)
|
* Double click (MOUSE_LEFT)
|
||||||
*
|
*
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool doubleClick();
|
bool doubleClick();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Click
|
* Click
|
||||||
*
|
*
|
||||||
* @param button state of the buttons ( ex: clic(MOUSE_LEFT))
|
* @param button state of the buttons ( ex: clic(MOUSE_LEFT))
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool click(uint8_t button);
|
bool click(uint8_t button);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scrolling
|
* Scrolling
|
||||||
*
|
*
|
||||||
|
@ -184,7 +184,7 @@ class USBMouse: public USBHID
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool scroll(int8_t z);
|
bool scroll(int8_t z);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
|
* 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
|
* @returns pointer to the configuration descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * configurationDesc();
|
virtual uint8_t * configurationDesc();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MOUSE_TYPE mouse_type;
|
MOUSE_TYPE mouse_type;
|
||||||
uint8_t button;
|
uint8_t button;
|
||||||
|
|
|
@ -178,7 +178,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
||||||
{0x4a, 0}, /* HOME */
|
{0x4a, 0}, /* HOME */
|
||||||
{0x4b, 0}, /* PAGE_UP */
|
{0x4b, 0}, /* PAGE_UP */
|
||||||
{0x4e, 0}, /* PAGE_DOWN */
|
{0x4e, 0}, /* PAGE_DOWN */
|
||||||
|
|
||||||
{0x4f, 0}, /* RIGHT_ARROW */
|
{0x4f, 0}, /* RIGHT_ARROW */
|
||||||
{0x50, 0}, /* LEFT_ARROW */
|
{0x50, 0}, /* LEFT_ARROW */
|
||||||
{0x51, 0}, /* DOWN_ARROW */
|
{0x51, 0}, /* DOWN_ARROW */
|
||||||
|
@ -339,7 +339,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
|
||||||
{0x4a, 0}, /* HOME */
|
{0x4a, 0}, /* HOME */
|
||||||
{0x4b, 0}, /* PAGE_UP */
|
{0x4b, 0}, /* PAGE_UP */
|
||||||
{0x4e, 0}, /* PAGE_DOWN */
|
{0x4e, 0}, /* PAGE_DOWN */
|
||||||
|
|
||||||
{0x4f, 0}, /* RIGHT_ARROW */
|
{0x4f, 0}, /* RIGHT_ARROW */
|
||||||
{0x50, 0}, /* LEFT_ARROW */
|
{0x50, 0}, /* LEFT_ARROW */
|
||||||
{0x51, 0}, /* DOWN_ARROW */
|
{0x51, 0}, /* DOWN_ARROW */
|
||||||
|
@ -552,10 +552,10 @@ bool USBMouseKeyboard::EP1_OUT_callback() {
|
||||||
uint32_t bytesRead = 0;
|
uint32_t bytesRead = 0;
|
||||||
uint8_t led[65];
|
uint8_t led[65];
|
||||||
USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
|
USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
|
||||||
|
|
||||||
// we take led[1] because led[0] is the report ID
|
// we take led[1] because led[0] is the report ID
|
||||||
lock_status = led[1] & 0x07;
|
lock_status = led[1] & 0x07;
|
||||||
|
|
||||||
// We activate the endpoint to be able to recceive data
|
// We activate the endpoint to be able to recceive data
|
||||||
if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
|
if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
|
||||||
return false;
|
return false;
|
||||||
|
@ -696,7 +696,7 @@ bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {
|
||||||
report.length = 2;
|
report.length = 2;
|
||||||
|
|
||||||
send(&report);
|
send(&report);
|
||||||
|
|
||||||
report.data[0] = REPORT_ID_VOLUME;
|
report.data[0] = REPORT_ID_VOLUME;
|
||||||
report.data[1] = 0;
|
report.data[1] = 0;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "USBHID.h"
|
#include "USBHID.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* USBMouseKeyboard example
|
* USBMouseKeyboard example
|
||||||
* @code
|
* @code
|
||||||
*
|
*
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
class USBMouseKeyboard: public USBHID, public Stream
|
class USBMouseKeyboard: public USBHID, public Stream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
|
@ -81,7 +81,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @param product_release Your preoduct_release (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):
|
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)
|
USBHID(0, 0, vendor_id, product_id, product_release, false)
|
||||||
{
|
{
|
||||||
lock_status = 0;
|
lock_status = 0;
|
||||||
|
@ -89,7 +89,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
this->mouse_type = mouse_type;
|
this->mouse_type = mouse_type;
|
||||||
connect();
|
connect();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a state of the mouse
|
* 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
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
|
bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the cursor to (x, y)
|
* 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
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool move(int16_t x, int16_t y);
|
bool move(int16_t x, int16_t y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Press one or several buttons
|
* Press one or several buttons
|
||||||
*
|
*
|
||||||
|
@ -118,7 +118,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool press(uint8_t button);
|
bool press(uint8_t button);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release one or several buttons
|
* Release one or several buttons
|
||||||
*
|
*
|
||||||
|
@ -126,22 +126,22 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool release(uint8_t button);
|
bool release(uint8_t button);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Double click (MOUSE_LEFT)
|
* Double click (MOUSE_LEFT)
|
||||||
*
|
*
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool doubleClick();
|
bool doubleClick();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Click
|
* Click
|
||||||
*
|
*
|
||||||
* @param button state of the buttons ( ex: clic(MOUSE_LEFT))
|
* @param button state of the buttons ( ex: clic(MOUSE_LEFT))
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool click(uint8_t button);
|
bool click(uint8_t button);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scrolling
|
* Scrolling
|
||||||
*
|
*
|
||||||
|
@ -151,7 +151,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
bool scroll(int8_t z);
|
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
|
* @code
|
||||||
* //To send CTRL + s (save)
|
* //To send CTRL + s (save)
|
||||||
|
@ -163,7 +163,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool keyCode(uint8_t key, uint8_t modifier = 0);
|
bool keyCode(uint8_t key, uint8_t modifier = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a character
|
* Send a character
|
||||||
*
|
*
|
||||||
|
@ -171,7 +171,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
virtual int _putc(int c);
|
virtual int _putc(int c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Control media keys
|
* Control media keys
|
||||||
*
|
*
|
||||||
|
@ -179,7 +179,7 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
bool mediaControl(MEDIA_KEY key);
|
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:
|
* 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
|
* - First bit: NUM_LOCK
|
||||||
|
@ -189,30 +189,30 @@ class USBMouseKeyboard: public USBHID, public Stream
|
||||||
* @returns status of lock keys
|
* @returns status of lock keys
|
||||||
*/
|
*/
|
||||||
uint8_t lockStatus();
|
uint8_t lockStatus();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
|
* 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
|
* @returns pointer to the report descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * reportDesc();
|
virtual uint8_t * reportDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
|
* 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
|
* @returns if handle by subclass, return true
|
||||||
*/
|
*/
|
||||||
virtual bool EP1_OUT_callback();
|
virtual bool EP1_OUT_callback();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z);
|
bool mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z);
|
||||||
MOUSE_TYPE mouse_type;
|
MOUSE_TYPE mouse_type;
|
||||||
uint8_t button;
|
uint8_t button;
|
||||||
bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
|
bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
|
||||||
|
|
||||||
uint8_t lock_status;
|
uint8_t lock_status;
|
||||||
|
|
||||||
//dummy otherwise it doesn't compile (we must define all methods of an abstract class)
|
//dummy otherwise it doesn't compile (we must define all methods of an abstract class)
|
||||||
virtual int _getc() { return -1;}
|
virtual int _getc() { return -1;}
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include "mbed.h"
|
#include "mbed.h"
|
||||||
|
|
||||||
// MIDI Message Format
|
// MIDI Message Format
|
||||||
//
|
//
|
||||||
// [ msg(4) | channel(4) ] [ 0 | n(7) ] [ 0 | m(7) ]
|
// [ msg(4) | channel(4) ] [ 0 | n(7) ] [ 0 | m(7) ]
|
||||||
//
|
//
|
||||||
// MIDI Data Messages (Channel Specific)
|
// MIDI Data Messages (Channel Specific)
|
||||||
|
@ -43,15 +43,15 @@
|
||||||
class MIDIMessage {
|
class MIDIMessage {
|
||||||
public:
|
public:
|
||||||
MIDIMessage() {}
|
MIDIMessage() {}
|
||||||
|
|
||||||
MIDIMessage(uint8_t *buf) {
|
MIDIMessage(uint8_t *buf) {
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
data[i] = buf[i];
|
data[i] = buf[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// create messages
|
// create messages
|
||||||
|
|
||||||
/** Create a NoteOff message
|
/** Create a NoteOff message
|
||||||
* @param key Key ID
|
* @param key Key ID
|
||||||
* @param velocity Key velocity (0-127, default = 127)
|
* @param velocity Key velocity (0-127, default = 127)
|
||||||
* @param channel Key channel (0-15, default 0)
|
* @param channel Key channel (0-15, default 0)
|
||||||
|
@ -62,11 +62,11 @@ public:
|
||||||
msg.data[0] = CABLE_NUM | 0x08;
|
msg.data[0] = CABLE_NUM | 0x08;
|
||||||
msg.data[1] = 0x80 | (channel & 0x0F);
|
msg.data[1] = 0x80 | (channel & 0x0F);
|
||||||
msg.data[2] = key & 0x7F;
|
msg.data[2] = key & 0x7F;
|
||||||
msg.data[3] = velocity & 0x7F;
|
msg.data[3] = velocity & 0x7F;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a NoteOn message
|
/** Create a NoteOn message
|
||||||
* @param key Key ID
|
* @param key Key ID
|
||||||
* @param velocity Key velocity (0-127, default = 127)
|
* @param velocity Key velocity (0-127, default = 127)
|
||||||
* @param channel Key channel (0-15, default 0)
|
* @param channel Key channel (0-15, default 0)
|
||||||
|
@ -77,26 +77,26 @@ public:
|
||||||
msg.data[0] = CABLE_NUM | 0x09;
|
msg.data[0] = CABLE_NUM | 0x09;
|
||||||
msg.data[1] = 0x90 | (channel & 0x0F);
|
msg.data[1] = 0x90 | (channel & 0x0F);
|
||||||
msg.data[2] = key & 0x7F;
|
msg.data[2] = key & 0x7F;
|
||||||
msg.data[3] = velocity & 0x7F;
|
msg.data[3] = velocity & 0x7F;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a PolyPhonic Aftertouch message
|
/** Create a PolyPhonic Aftertouch message
|
||||||
* @param key Key ID
|
* @param key Key ID
|
||||||
* @param pressure Aftertouch pressure (0-127)
|
* @param pressure Aftertouch pressure (0-127)
|
||||||
* @param channel Key channel (0-15, default 0)
|
* @param channel Key channel (0-15, default 0)
|
||||||
* @returns A MIDIMessage
|
* @returns A MIDIMessage
|
||||||
*/
|
*/
|
||||||
static MIDIMessage PolyphonicAftertouch(int key, int pressure, int channel = 0) {
|
static MIDIMessage PolyphonicAftertouch(int key, int pressure, int channel = 0) {
|
||||||
MIDIMessage msg;
|
MIDIMessage msg;
|
||||||
msg.data[0] = CABLE_NUM | 0x0A;
|
msg.data[0] = CABLE_NUM | 0x0A;
|
||||||
msg.data[1] = 0xA0 | (channel & 0x0F);
|
msg.data[1] = 0xA0 | (channel & 0x0F);
|
||||||
msg.data[2] = key & 0x7F;
|
msg.data[2] = key & 0x7F;
|
||||||
msg.data[3] = pressure & 0x7F;
|
msg.data[3] = pressure & 0x7F;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a Control Change message
|
/** Create a Control Change message
|
||||||
* @param control Controller ID
|
* @param control Controller ID
|
||||||
* @param value Controller value (0-127)
|
* @param value Controller value (0-127)
|
||||||
* @param channel Controller channel (0-15, default 0)
|
* @param channel Controller channel (0-15, default 0)
|
||||||
|
@ -107,63 +107,63 @@ public:
|
||||||
msg.data[0] = CABLE_NUM | 0x0B;
|
msg.data[0] = CABLE_NUM | 0x0B;
|
||||||
msg.data[1] = 0xB0 | (channel & 0x0F);
|
msg.data[1] = 0xB0 | (channel & 0x0F);
|
||||||
msg.data[2] = control & 0x7F;
|
msg.data[2] = control & 0x7F;
|
||||||
msg.data[3] = value & 0x7F;
|
msg.data[3] = value & 0x7F;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a Program Change message
|
/** Create a Program Change message
|
||||||
* @param program Program ID
|
* @param program Program ID
|
||||||
* @param channel Channel (0-15, default 0)
|
* @param channel Channel (0-15, default 0)
|
||||||
* @returns A MIDIMessage
|
* @returns A MIDIMessage
|
||||||
*/
|
*/
|
||||||
static MIDIMessage ProgramChange(int program, int channel = 0) {
|
static MIDIMessage ProgramChange(int program, int channel = 0) {
|
||||||
MIDIMessage msg;
|
MIDIMessage msg;
|
||||||
msg.data[0] = CABLE_NUM | 0x0C;
|
msg.data[0] = CABLE_NUM | 0x0C;
|
||||||
msg.data[1] = 0xC0 | (channel & 0x0F);
|
msg.data[1] = 0xC0 | (channel & 0x0F);
|
||||||
msg.data[2] = program & 0x7F;
|
msg.data[2] = program & 0x7F;
|
||||||
msg.data[3] = 0x00;
|
msg.data[3] = 0x00;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a Channel Aftertouch message
|
/** Create a Channel Aftertouch message
|
||||||
* @param pressure Pressure
|
* @param pressure Pressure
|
||||||
* @param channel Key channel (0-15, default 0)
|
* @param channel Key channel (0-15, default 0)
|
||||||
* @returns A MIDIMessage
|
* @returns A MIDIMessage
|
||||||
*/
|
*/
|
||||||
static MIDIMessage ChannelAftertouch(int pressure, int channel = 0) {
|
static MIDIMessage ChannelAftertouch(int pressure, int channel = 0) {
|
||||||
MIDIMessage msg;
|
MIDIMessage msg;
|
||||||
msg.data[0] = CABLE_NUM | 0x0D;
|
msg.data[0] = CABLE_NUM | 0x0D;
|
||||||
msg.data[1] = 0xD0 | (channel & 0x0F);
|
msg.data[1] = 0xD0 | (channel & 0x0F);
|
||||||
msg.data[2] = pressure & 0x7F;
|
msg.data[2] = pressure & 0x7F;
|
||||||
msg.data[3] = 0x00;
|
msg.data[3] = 0x00;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a Pitch Wheel message
|
/** Create a Pitch Wheel message
|
||||||
* @param pitch Pitch (-8192 - 8191, default = 0)
|
* @param pitch Pitch (-8192 - 8191, default = 0)
|
||||||
* @param channel Channel (0-15, default 0)
|
* @param channel Channel (0-15, default 0)
|
||||||
* @returns A MIDIMessage
|
* @returns A MIDIMessage
|
||||||
*/
|
*/
|
||||||
static MIDIMessage PitchWheel(int pitch = 0, int channel = 0) {
|
static MIDIMessage PitchWheel(int pitch = 0, int channel = 0) {
|
||||||
MIDIMessage msg;
|
MIDIMessage msg;
|
||||||
int p = pitch + 8192; // 0 - 16383, 8192 is center
|
int p = pitch + 8192; // 0 - 16383, 8192 is center
|
||||||
msg.data[0] = CABLE_NUM | 0x0E;
|
msg.data[0] = CABLE_NUM | 0x0E;
|
||||||
msg.data[1] = 0xE0 | (channel & 0x0F);
|
msg.data[1] = 0xE0 | (channel & 0x0F);
|
||||||
msg.data[2] = p & 0x7F;
|
msg.data[2] = p & 0x7F;
|
||||||
msg.data[3] = (p >> 7) & 0x7F;
|
msg.data[3] = (p >> 7) & 0x7F;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create an All Notes Off message
|
/** Create an All Notes Off message
|
||||||
* @param channel Channel (0-15, default 0)
|
* @param channel Channel (0-15, default 0)
|
||||||
* @returns A MIDIMessage
|
* @returns A MIDIMessage
|
||||||
*/
|
*/
|
||||||
static MIDIMessage AllNotesOff(int channel = 0) {
|
static MIDIMessage AllNotesOff(int channel = 0) {
|
||||||
return ControlChange(123, 0, channel);
|
return ControlChange(123, 0, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decode messages
|
// decode messages
|
||||||
|
|
||||||
/** MIDI Message Types */
|
/** MIDI Message Types */
|
||||||
enum MIDIMessageType {
|
enum MIDIMessageType {
|
||||||
ErrorType,
|
ErrorType,
|
||||||
|
@ -176,16 +176,16 @@ public:
|
||||||
PitchWheelType,
|
PitchWheelType,
|
||||||
AllNotesOffType
|
AllNotesOffType
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Read the message type
|
/** Read the message type
|
||||||
* @returns MIDIMessageType
|
* @returns MIDIMessageType
|
||||||
*/
|
*/
|
||||||
MIDIMessageType type() {
|
MIDIMessageType type() {
|
||||||
switch((data[1] >> 4) & 0xF) {
|
switch((data[1] >> 4) & 0xF) {
|
||||||
case 0x8: return NoteOffType;
|
case 0x8: return NoteOffType;
|
||||||
case 0x9: return NoteOnType;
|
case 0x9: return NoteOnType;
|
||||||
case 0xA: return PolyphonicAftertouchType;
|
case 0xA: return PolyphonicAftertouchType;
|
||||||
case 0xB:
|
case 0xB:
|
||||||
if(controller() < 120) { // standard controllers
|
if(controller() < 120) { // standard controllers
|
||||||
return ControlChangeType;
|
return ControlChangeType;
|
||||||
} else if(controller() == 123) {
|
} else if(controller() == 123) {
|
||||||
|
@ -200,51 +200,51 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the channel number */
|
/** Read the channel number */
|
||||||
int channel() {
|
int channel() {
|
||||||
return (data[1] & 0x0F);
|
return (data[1] & 0x0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the key ID */
|
/** Read the key ID */
|
||||||
int key() {
|
int key() {
|
||||||
return (data[2] & 0x7F);
|
return (data[2] & 0x7F);
|
||||||
}
|
|
||||||
|
|
||||||
/** Read the velocity */
|
|
||||||
int velocity() {
|
|
||||||
return (data[3] & 0x7F);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the controller value */
|
/** Read the velocity */
|
||||||
int value() {
|
int velocity() {
|
||||||
return (data[3] & 0x7F);
|
return (data[3] & 0x7F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the aftertouch pressure */
|
/** Read the controller value */
|
||||||
|
int value() {
|
||||||
|
return (data[3] & 0x7F);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Read the aftertouch pressure */
|
||||||
int pressure() {
|
int pressure() {
|
||||||
if(type() == PolyphonicAftertouchType) {
|
if(type() == PolyphonicAftertouchType) {
|
||||||
return (data[3] & 0x7F);
|
return (data[3] & 0x7F);
|
||||||
} else {
|
} else {
|
||||||
return (data[2] & 0x7F);
|
return (data[2] & 0x7F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the controller number */
|
/** Read the controller number */
|
||||||
int controller() {
|
int controller() {
|
||||||
return (data[2] & 0x7F);
|
return (data[2] & 0x7F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the program number */
|
/** Read the program number */
|
||||||
int program() {
|
int program() {
|
||||||
return (data[2] & 0x7F);
|
return (data[2] & 0x7F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read the pitch value */
|
/** Read the pitch value */
|
||||||
int pitch() {
|
int pitch() {
|
||||||
int p = ((data[3] & 0x7F) << 7) | (data[2] & 0x7F);
|
int p = ((data[3] & 0x7F) << 7) | (data[2] & 0x7F);
|
||||||
return p - 8192; // 0 - 16383, 8192 is center
|
return p - 8192; // 0 - 16383, 8192 is center
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t data[4];
|
uint8_t data[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
#define DEFAULT_CONFIGURATION (1)
|
#define DEFAULT_CONFIGURATION (1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* USBMIDI example
|
* USBMIDI example
|
||||||
*
|
*
|
||||||
* @code
|
* @code
|
||||||
|
@ -38,8 +38,8 @@
|
||||||
*
|
*
|
||||||
* USBMIDI midi;
|
* USBMIDI midi;
|
||||||
*
|
*
|
||||||
* int main() {
|
* int main() {
|
||||||
* while (1) {
|
* while (1) {
|
||||||
* for(int i=48; i<83; i++) { // send some messages!
|
* for(int i=48; i<83; i++) { // send some messages!
|
||||||
* midi.write(MIDIMessage::NoteOn(i));
|
* midi.write(MIDIMessage::NoteOn(i));
|
||||||
* wait(0.25);
|
* wait(0.25);
|
||||||
|
@ -61,12 +61,12 @@ public:
|
||||||
* @param product_release Your preoduct_release
|
* @param product_release Your preoduct_release
|
||||||
*/
|
*/
|
||||||
USBMIDI(uint16_t vendor_id = 0x0700, uint16_t product_id = 0x0101, uint16_t product_release = 0x0001);
|
USBMIDI(uint16_t vendor_id = 0x0700, uint16_t product_id = 0x0101, uint16_t product_release = 0x0001);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a MIDIMessage
|
* Send a MIDIMessage
|
||||||
*
|
*
|
||||||
* @param m The MIDIMessage to send
|
* @param m The MIDIMessage to send
|
||||||
*/
|
*/
|
||||||
void write(MIDIMessage m);
|
void write(MIDIMessage m);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,8 +75,8 @@ public:
|
||||||
* @param fptr function pointer
|
* @param fptr function pointer
|
||||||
*/
|
*/
|
||||||
void attach(void (*fptr)(MIDIMessage));
|
void attach(void (*fptr)(MIDIMessage));
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool EP2_OUT_callback();
|
virtual bool EP2_OUT_callback();
|
||||||
virtual bool USBCallback_setConfiguration(uint8_t configuration);
|
virtual bool USBCallback_setConfiguration(uint8_t configuration);
|
||||||
|
@ -86,14 +86,14 @@ protected:
|
||||||
* @returns pointer to the string product descriptor
|
* @returns pointer to the string product descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIproductDesc();
|
virtual uint8_t * stringIproductDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string interface descriptor
|
* Get string interface descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string interface descriptor
|
* @returns pointer to the string interface descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIinterfaceDesc();
|
virtual uint8_t * stringIinterfaceDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get configuration descriptor
|
* Get configuration descriptor
|
||||||
*
|
*
|
||||||
|
|
|
@ -79,7 +79,7 @@ public:
|
||||||
* Disconnect the USB MSD device.
|
* Disconnect the USB MSD device.
|
||||||
*/
|
*/
|
||||||
void disconnect();
|
void disconnect();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -73,15 +73,15 @@ void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
|
||||||
if (length != 7) {
|
if (length != 7) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CONTROL_TRANSFER * transfer = getTransferPtr();
|
CONTROL_TRANSFER * transfer = getTransferPtr();
|
||||||
|
|
||||||
/* Process class-specific requests */
|
/* Process class-specific requests */
|
||||||
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
|
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
|
||||||
if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
|
if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
|
||||||
if (memcmp(cdc_line_coding, buf, 7)) {
|
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)
|
int baud = buf[0] + (buf[1] << 8)
|
||||||
+ (buf[2] << 16) + (buf[3] << 24);
|
+ (buf[2] << 16) + (buf[3] << 24);
|
||||||
int stop = buf[4];
|
int stop = buf[4];
|
||||||
|
@ -186,7 +186,7 @@ uint8_t * USBCDC::configurationDesc() {
|
||||||
0, // iConfiguration
|
0, // iConfiguration
|
||||||
0x80, // bmAttributes
|
0x80, // bmAttributes
|
||||||
50, // bMaxPower
|
50, // bMaxPower
|
||||||
|
|
||||||
// IAD to associate the two CDC interfaces
|
// IAD to associate the two CDC interfaces
|
||||||
0x08, // bLength
|
0x08, // bLength
|
||||||
0x0b, // bDescriptorType
|
0x0b, // bDescriptorType
|
||||||
|
|
|
@ -40,35 +40,35 @@ public:
|
||||||
USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking);
|
USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
|
* Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
|
||||||
*
|
*
|
||||||
* @returns pointer to the device descriptor
|
* @returns pointer to the device descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * deviceDesc();
|
virtual uint8_t * deviceDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string product descriptor
|
* Get string product descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string product descriptor
|
* @returns pointer to the string product descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIproductDesc();
|
virtual uint8_t * stringIproductDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get string interface descriptor
|
* Get string interface descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the string interface descriptor
|
* @returns pointer to the string interface descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * stringIinterfaceDesc();
|
virtual uint8_t * stringIinterfaceDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get configuration descriptor
|
* Get configuration descriptor
|
||||||
*
|
*
|
||||||
* @returns pointer to the configuration descriptor
|
* @returns pointer to the configuration descriptor
|
||||||
*/
|
*/
|
||||||
virtual uint8_t * configurationDesc();
|
virtual uint8_t * configurationDesc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send a buffer
|
* Send a buffer
|
||||||
*
|
*
|
||||||
|
@ -78,7 +78,7 @@ protected:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool send(uint8_t * buffer, uint32_t size);
|
bool send(uint8_t * buffer, uint32_t size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read a buffer from a certain endpoint. Warning: blocking
|
* Read a buffer from a certain endpoint. Warning: blocking
|
||||||
*
|
*
|
||||||
|
@ -89,7 +89,7 @@ protected:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool readEP(uint8_t * buffer, uint32_t * size);
|
bool readEP(uint8_t * buffer, uint32_t * size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read a buffer from a certain endpoint. Warning: non blocking
|
* 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)
|
* @param stop The number of stop bits (1 or 2)
|
||||||
*/
|
*/
|
||||||
virtual void lineCodingChanged(int baud, int bits, int parity, int stop) {};
|
virtual void lineCodingChanged(int baud, int bits, int parity, int stop) {};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool USBCallback_request();
|
virtual bool USBCallback_request();
|
||||||
virtual void USBCallback_requestCompleted(uint8_t *buf, uint32_t length);
|
virtual void USBCallback_requestCompleted(uint8_t *buf, uint32_t length);
|
||||||
|
|
|
@ -68,20 +68,20 @@ public:
|
||||||
* @returns true if there is no error, false otherwise
|
* @returns true if there is no error, false otherwise
|
||||||
*/
|
*/
|
||||||
virtual int _putc(int c);
|
virtual int _putc(int c);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a character: blocking
|
* Read a character: blocking
|
||||||
*
|
*
|
||||||
* @returns character read
|
* @returns character read
|
||||||
*/
|
*/
|
||||||
virtual int _getc();
|
virtual int _getc();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check the number of bytes available.
|
* Check the number of bytes available.
|
||||||
*
|
*
|
||||||
* @returns 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
|
/** Determine if there is a character available to read
|
||||||
*
|
*
|
||||||
|
@ -90,7 +90,7 @@ public:
|
||||||
* 0 otherwise
|
* 0 otherwise
|
||||||
*/
|
*/
|
||||||
int readable() { return available() ? 1 : 0; }
|
int readable() { return available() ? 1 : 0; }
|
||||||
|
|
||||||
/** Determine if there is space available to write a character
|
/** Determine if there is space available to write a character
|
||||||
*
|
*
|
||||||
* @returns
|
* @returns
|
||||||
|
@ -98,9 +98,9 @@ public:
|
||||||
* 0 otherwise
|
* 0 otherwise
|
||||||
*/
|
*/
|
||||||
int writeable() { return 1; } // always return 1, for write operation is blocking
|
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.
|
* 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);
|
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 tptr pointer to the object to call the member function on
|
||||||
* @param mptr pointer to the member function to be called
|
* @param mptr pointer to the member function to be called
|
||||||
|
|
|
@ -50,10 +50,10 @@ void USBDeviceConnected::init() {
|
||||||
INTERFACE * USBDeviceConnected::getInterface(uint8_t index) {
|
INTERFACE * USBDeviceConnected::getInterface(uint8_t index) {
|
||||||
if (index >= MAX_INTF)
|
if (index >= MAX_INTF)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (intf[index].in_use)
|
if (intf[index].in_use)
|
||||||
return &intf[index];
|
return &intf[index];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ typedef struct {
|
||||||
USBEndpoint * ep[MAX_ENDPOINT_PER_INTERFACE];
|
USBEndpoint * ep[MAX_ENDPOINT_PER_INTERFACE];
|
||||||
FunctionPointer detach;
|
FunctionPointer detach;
|
||||||
char name[10];
|
char name[10];
|
||||||
} INTERFACE;
|
} INTERFACE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* USBDeviceConnected class
|
* USBDeviceConnected class
|
||||||
|
@ -157,7 +157,7 @@ public:
|
||||||
inline USBHostHub * getHubParent() { return hub_parent; };
|
inline USBHostHub * getHubParent() { return hub_parent; };
|
||||||
inline uint8_t getNbIntf() { return nb_interf; };
|
inline uint8_t getNbIntf() { return nb_interf; };
|
||||||
inline const char * getName(uint8_t intf_nb) { return intf[intf_nb].name; };
|
inline const char * getName(uint8_t intf_nb) { return intf[intf_nb].name; };
|
||||||
|
|
||||||
// in case this device is a hub
|
// in case this device is a hub
|
||||||
USBHostHub * hub;
|
USBHostHub * hub;
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ void USBEndpoint::init(HCED * hced_, ENDPOINT_TYPE type_, ENDPOINT_DIRECTION dir
|
||||||
memcpy((HCTD**)td_list, td_list_, sizeof(HCTD*)*2); //TODO: Maybe should add a param for td_list size... at least a define
|
memcpy((HCTD**)td_list, td_list_, sizeof(HCTD*)*2); //TODO: Maybe should add a param for td_list size... at least a define
|
||||||
memset(td_list_[0], 0, sizeof(HCTD));
|
memset(td_list_[0], 0, sizeof(HCTD));
|
||||||
memset(td_list_[1], 0, sizeof(HCTD));
|
memset(td_list_[1], 0, sizeof(HCTD));
|
||||||
|
|
||||||
td_list[0]->ep = this;
|
td_list[0]->ep = this;
|
||||||
td_list[1]->ep = this;
|
td_list[1]->ep = this;
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ void USBEndpoint::init(HCED * hced_, ENDPOINT_TYPE type_, ENDPOINT_DIRECTION dir
|
||||||
|
|
||||||
td_current = td_list[0];
|
td_current = td_list[0];
|
||||||
td_next = td_list[1];
|
td_next = td_list[1];
|
||||||
|
|
||||||
intf_nb = 0;
|
intf_nb = 0;
|
||||||
|
|
||||||
state = USB_TYPE_IDLE;
|
state = USB_TYPE_IDLE;
|
||||||
|
|
|
@ -136,9 +136,9 @@ public:
|
||||||
inline bool isSetup() { return setup; }
|
inline bool isSetup() { return setup; }
|
||||||
inline USBEndpoint * nextEndpoint() { return (USBEndpoint*)nextEp; };
|
inline USBEndpoint * nextEndpoint() { return (USBEndpoint*)nextEp; };
|
||||||
inline uint8_t getIntfNb() { return intf_nb; };
|
inline uint8_t getIntfNb() { return intf_nb; };
|
||||||
|
|
||||||
USBDeviceConnected * dev;
|
USBDeviceConnected * dev;
|
||||||
|
|
||||||
Queue<uint8_t, 1> ep_queue;
|
Queue<uint8_t, 1> ep_queue;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -163,7 +163,7 @@ private:
|
||||||
volatile HCTD * td_list[2];
|
volatile HCTD * td_list[2];
|
||||||
volatile HCTD * td_current;
|
volatile HCTD * td_current;
|
||||||
volatile HCTD * td_next;
|
volatile HCTD * td_next;
|
||||||
|
|
||||||
uint8_t intf_nb;
|
uint8_t intf_nb;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -57,7 +57,7 @@ USBHALHost::USBHALHost() {
|
||||||
|
|
||||||
void USBHALHost::init() {
|
void USBHALHost::init() {
|
||||||
NVIC_DisableIRQ(USB_IRQn);
|
NVIC_DisableIRQ(USB_IRQn);
|
||||||
|
|
||||||
//Cut power
|
//Cut power
|
||||||
LPC_SC->PCONP &= ~(1UL<<31);
|
LPC_SC->PCONP &= ~(1UL<<31);
|
||||||
wait_ms(100);
|
wait_ms(100);
|
||||||
|
@ -98,7 +98,7 @@ void USBHALHost::init() {
|
||||||
|
|
||||||
// software reset
|
// software reset
|
||||||
LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
|
LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
|
||||||
|
|
||||||
// Write Fm Interval and Largest Data Packet Counter
|
// Write Fm Interval and Largest Data Packet Counter
|
||||||
LPC_USB->HcFmInterval = DEFAULT_FMINTERVAL;
|
LPC_USB->HcFmInterval = DEFAULT_FMINTERVAL;
|
||||||
LPC_USB->HcPeriodicStart = FI * 90 / 100;
|
LPC_USB->HcPeriodicStart = FI * 90 / 100;
|
||||||
|
@ -109,7 +109,7 @@ void USBHALHost::init() {
|
||||||
LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC;
|
LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC;
|
||||||
|
|
||||||
LPC_USB->HcHCCA = (uint32_t)(usb_hcca);
|
LPC_USB->HcHCCA = (uint32_t)(usb_hcca);
|
||||||
|
|
||||||
// Clear Interrrupt Status
|
// Clear Interrrupt Status
|
||||||
LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus;
|
LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus;
|
||||||
|
|
||||||
|
@ -249,9 +249,9 @@ void USBHALHost::freeTD(volatile uint8_t * td) {
|
||||||
void USBHALHost::resetRootHub() {
|
void USBHALHost::resetRootHub() {
|
||||||
// Initiate port reset
|
// Initiate port reset
|
||||||
LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS;
|
LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS;
|
||||||
|
|
||||||
while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS);
|
while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS);
|
||||||
|
|
||||||
// ...and clear port reset signal
|
// ...and clear port reset signal
|
||||||
LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
|
LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
|
||||||
}
|
}
|
||||||
|
@ -266,11 +266,11 @@ void USBHALHost::_usbisr(void) {
|
||||||
void USBHALHost::UsbIrqhandler() {
|
void USBHALHost::UsbIrqhandler() {
|
||||||
if( LPC_USB->HcInterruptStatus & LPC_USB->HcInterruptEnable ) //Is there something to actually process?
|
if( LPC_USB->HcInterruptStatus & LPC_USB->HcInterruptEnable ) //Is there something to actually process?
|
||||||
{
|
{
|
||||||
|
|
||||||
uint32_t int_status = LPC_USB->HcInterruptStatus & LPC_USB->HcInterruptEnable;
|
uint32_t int_status = LPC_USB->HcInterruptStatus & LPC_USB->HcInterruptEnable;
|
||||||
|
|
||||||
// Root hub status change interrupt
|
// Root hub status change interrupt
|
||||||
if (int_status & OR_INTR_STATUS_RHSC) {
|
if (int_status & OR_INTR_STATUS_RHSC) {
|
||||||
if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
|
if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
|
||||||
if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
|
if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
|
||||||
// When DRWE is on, Connect Status Change
|
// When DRWE is on, Connect Status Change
|
||||||
|
@ -278,27 +278,27 @@ void USBHALHost::UsbIrqhandler() {
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
//Root device connected
|
//Root device connected
|
||||||
if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
|
if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
|
||||||
|
|
||||||
// wait 150ms to avoid bounce
|
// wait 150ms to avoid bounce
|
||||||
wait_ms(150);
|
wait_ms(150);
|
||||||
|
|
||||||
//Hub 0 (root hub), Port 1 (count starts at 1), Low or High speed
|
//Hub 0 (root hub), Port 1 (count starts at 1), Low or High speed
|
||||||
deviceConnected(0, 1, LPC_USB->HcRhPortStatus1 & OR_RH_PORT_LSDA);
|
deviceConnected(0, 1, LPC_USB->HcRhPortStatus1 & OR_RH_PORT_LSDA);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Root device disconnected
|
//Root device disconnected
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (!(int_status & OR_INTR_STATUS_WDH)) {
|
if (!(int_status & OR_INTR_STATUS_WDH)) {
|
||||||
usb_hcca->DoneHead = 0;
|
usb_hcca->DoneHead = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait 200ms to avoid bounce
|
// wait 200ms to avoid bounce
|
||||||
wait_ms(200);
|
wait_ms(200);
|
||||||
|
|
||||||
deviceDisconnected(0, 1, NULL, usb_hcca->DoneHead & 0xFFFFFFFE);
|
deviceDisconnected(0, 1, NULL, usb_hcca->DoneHead & 0xFFFFFFFE);
|
||||||
|
|
||||||
if (int_status & OR_INTR_STATUS_WDH) {
|
if (int_status & OR_INTR_STATUS_WDH) {
|
||||||
usb_hcca->DoneHead = 0;
|
usb_hcca->DoneHead = 0;
|
||||||
LPC_USB->HcInterruptStatus = OR_INTR_STATUS_WDH;
|
LPC_USB->HcInterruptStatus = OR_INTR_STATUS_WDH;
|
||||||
|
|
|
@ -33,61 +33,61 @@ protected:
|
||||||
* init variables and memory where will be stored HCCA, ED and TD
|
* init variables and memory where will be stored HCCA, ED and TD
|
||||||
*/
|
*/
|
||||||
USBHALHost();
|
USBHALHost();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize host controller. Enable USB interrupts. This part is not in the constructor because,
|
* Initialize host controller. Enable USB interrupts. This part is not in the constructor because,
|
||||||
* this function calls a virtual method if a device is already connected
|
* this function calls a virtual method if a device is already connected
|
||||||
*/
|
*/
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reset the root hub
|
* reset the root hub
|
||||||
*/
|
*/
|
||||||
void resetRootHub();
|
void resetRootHub();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return the value contained in the control HEAD ED register
|
* return the value contained in the control HEAD ED register
|
||||||
*
|
*
|
||||||
* @returns address of the control Head ED
|
* @returns address of the control Head ED
|
||||||
*/
|
*/
|
||||||
uint32_t controlHeadED();
|
uint32_t controlHeadED();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return the value contained in the bulk HEAD ED register
|
* return the value contained in the bulk HEAD ED register
|
||||||
*
|
*
|
||||||
* @returns address of the bulk head ED
|
* @returns address of the bulk head ED
|
||||||
*/
|
*/
|
||||||
uint32_t bulkHeadED();
|
uint32_t bulkHeadED();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return the value of the head interrupt ED contained in the HCCA
|
* return the value of the head interrupt ED contained in the HCCA
|
||||||
*
|
*
|
||||||
* @returns address of the head interrupt ED contained in the HCCA
|
* @returns address of the head interrupt ED contained in the HCCA
|
||||||
*/
|
*/
|
||||||
uint32_t interruptHeadED();
|
uint32_t interruptHeadED();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the head ED for control transfers
|
* Update the head ED for control transfers
|
||||||
*/
|
*/
|
||||||
void updateControlHeadED(uint32_t addr);
|
void updateControlHeadED(uint32_t addr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the head ED for bulk transfers
|
* Update the head ED for bulk transfers
|
||||||
*/
|
*/
|
||||||
void updateBulkHeadED(uint32_t addr);
|
void updateBulkHeadED(uint32_t addr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the head ED for interrupt transfers
|
* Update the head ED for interrupt transfers
|
||||||
*/
|
*/
|
||||||
void updateInterruptHeadED(uint32_t addr);
|
void updateInterruptHeadED(uint32_t addr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable List for the specified endpoint type
|
* Enable List for the specified endpoint type
|
||||||
*
|
*
|
||||||
* @param type enable the list of ENDPOINT_TYPE type
|
* @param type enable the list of ENDPOINT_TYPE type
|
||||||
*/
|
*/
|
||||||
void enableList(ENDPOINT_TYPE type);
|
void enableList(ENDPOINT_TYPE type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disable List for the specified endpoint type
|
* Disable List for the specified endpoint type
|
||||||
*
|
*
|
||||||
|
@ -104,7 +104,7 @@ protected:
|
||||||
* @param hub_parent reference to the hub where the device is connected (NULL if the hub parent is the root hub)
|
* @param hub_parent reference to the hub where the device is connected (NULL if the hub parent is the root hub)
|
||||||
*/
|
*/
|
||||||
virtual void deviceConnected(int hub, int port, bool lowSpeed, USBHostHub * hub_parent = NULL) = 0;
|
virtual void deviceConnected(int hub, int port, bool lowSpeed, USBHostHub * hub_parent = NULL) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual method called when a device has been disconnected
|
* Virtual method called when a device has been disconnected
|
||||||
*
|
*
|
||||||
|
@ -114,35 +114,35 @@ protected:
|
||||||
* @param addr list of the TDs which have been completed to dequeue freed TDs
|
* @param addr list of the TDs which have been completed to dequeue freed TDs
|
||||||
*/
|
*/
|
||||||
virtual void deviceDisconnected(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr) = 0;
|
virtual void deviceDisconnected(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual method called when a transfer has been completed
|
* Virtual method called when a transfer has been completed
|
||||||
*
|
*
|
||||||
* @param addr list of the TDs which have been completed
|
* @param addr list of the TDs which have been completed
|
||||||
*/
|
*/
|
||||||
virtual void transferCompleted(volatile uint32_t addr) = 0;
|
virtual void transferCompleted(volatile uint32_t addr) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a memory section for a new ED
|
* Find a memory section for a new ED
|
||||||
*
|
*
|
||||||
* @returns the address of the new ED
|
* @returns the address of the new ED
|
||||||
*/
|
*/
|
||||||
volatile uint8_t * getED();
|
volatile uint8_t * getED();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a memory section for a new TD
|
* Find a memory section for a new TD
|
||||||
*
|
*
|
||||||
* @returns the address of the new TD
|
* @returns the address of the new TD
|
||||||
*/
|
*/
|
||||||
volatile uint8_t * getTD();
|
volatile uint8_t * getTD();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release a previous memory section reserved for an ED
|
* Release a previous memory section reserved for an ED
|
||||||
*
|
*
|
||||||
* @param ed address of the ED
|
* @param ed address of the ED
|
||||||
*/
|
*/
|
||||||
void freeED(volatile uint8_t * ed);
|
void freeED(volatile uint8_t * ed);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release a previous memory section reserved for an TD
|
* Release a previous memory section reserved for an TD
|
||||||
*
|
*
|
||||||
|
@ -161,7 +161,7 @@ private:
|
||||||
uint8_t volatile * usb_tdBuf; //4 bytes aligned
|
uint8_t volatile * usb_tdBuf; //4 bytes aligned
|
||||||
|
|
||||||
static USBHALHost * instHost;
|
static USBHALHost * instHost;
|
||||||
|
|
||||||
bool volatile edBufAlloc[MAX_ENDPOINT];
|
bool volatile edBufAlloc[MAX_ENDPOINT];
|
||||||
bool volatile tdBufAlloc[MAX_TD];
|
bool volatile tdBufAlloc[MAX_TD];
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,7 +47,7 @@ USBHost * USBHost::instHost = NULL;
|
||||||
* - call the callback attached to the endpoint where the td is attached
|
* - call the callback attached to the endpoint where the td is attached
|
||||||
*/
|
*/
|
||||||
void USBHost::usb_process() {
|
void USBHost::usb_process() {
|
||||||
|
|
||||||
bool controlListState;
|
bool controlListState;
|
||||||
bool bulkListState;
|
bool bulkListState;
|
||||||
bool interruptListState;
|
bool interruptListState;
|
||||||
|
@ -60,29 +60,29 @@ void USBHost::usb_process() {
|
||||||
#if DEBUG_TRANSFER
|
#if DEBUG_TRANSFER
|
||||||
uint8_t * buf_transfer;
|
uint8_t * buf_transfer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MAX_HUB_NB
|
#if MAX_HUB_NB
|
||||||
uint8_t k;
|
uint8_t k;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
osEvent evt = mail_usb_event.get();
|
osEvent evt = mail_usb_event.get();
|
||||||
|
|
||||||
if (evt.status == osEventMail) {
|
if (evt.status == osEventMail) {
|
||||||
|
|
||||||
message_t * usb_msg = (message_t*)evt.value.p;
|
message_t * usb_msg = (message_t*)evt.value.p;
|
||||||
|
|
||||||
switch (usb_msg->event_id) {
|
switch (usb_msg->event_id) {
|
||||||
|
|
||||||
// a new device has been connected
|
// a new device has been connected
|
||||||
case DEVICE_CONNECTED_EVENT:
|
case DEVICE_CONNECTED_EVENT:
|
||||||
too_many_hub = false;
|
too_many_hub = false;
|
||||||
buf[4] = 0;
|
buf[4] = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
Lock lock(this);
|
Lock lock(this);
|
||||||
|
|
||||||
for (i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
for (i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
||||||
if (!deviceInUse[i]) {
|
if (!deviceInUse[i]) {
|
||||||
USB_DBG_EVENT("new device connected: %p\r\n", &devices[i]);
|
USB_DBG_EVENT("new device connected: %p\r\n", &devices[i]);
|
||||||
|
@ -92,68 +92,68 @@ void USBHost::usb_process() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == MAX_DEVICE_CONNECTED) {
|
if (i == MAX_DEVICE_CONNECTED) {
|
||||||
USB_ERR("Too many device connected!!\r\n");
|
USB_ERR("Too many device connected!!\r\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!controlEndpointAllocated) {
|
if (!controlEndpointAllocated) {
|
||||||
control = newEndpoint(CONTROL_ENDPOINT, OUT, 0x08, 0x00);
|
control = newEndpoint(CONTROL_ENDPOINT, OUT, 0x08, 0x00);
|
||||||
addEndpoint(NULL, 0, (USBEndpoint*)control);
|
addEndpoint(NULL, 0, (USBEndpoint*)control);
|
||||||
controlEndpointAllocated = true;
|
controlEndpointAllocated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MAX_HUB_NB
|
#if MAX_HUB_NB
|
||||||
if (usb_msg->hub_parent)
|
if (usb_msg->hub_parent)
|
||||||
devices[i].setHubParent((USBHostHub *)(usb_msg->hub_parent));
|
devices[i].setHubParent((USBHostHub *)(usb_msg->hub_parent));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (j = 0; j < timeout_set_addr; j++) {
|
for (j = 0; j < timeout_set_addr; j++) {
|
||||||
|
|
||||||
resetDevice(&devices[i]);
|
resetDevice(&devices[i]);
|
||||||
|
|
||||||
// set size of control endpoint
|
// set size of control endpoint
|
||||||
devices[i].setSizeControlEndpoint(8);
|
devices[i].setSizeControlEndpoint(8);
|
||||||
|
|
||||||
devices[i].activeAddress(false);
|
devices[i].activeAddress(false);
|
||||||
|
|
||||||
// get first 8 bit of device descriptor
|
// get first 8 bit of device descriptor
|
||||||
// and check if we deal with a hub
|
// and check if we deal with a hub
|
||||||
USB_DBG("usb_thread read device descriptor on dev: %p\r\n", &devices[i]);
|
USB_DBG("usb_thread read device descriptor on dev: %p\r\n", &devices[i]);
|
||||||
res = getDeviceDescriptor(&devices[i], buf, 8);
|
res = getDeviceDescriptor(&devices[i], buf, 8);
|
||||||
|
|
||||||
if (res != USB_TYPE_OK) {
|
if (res != USB_TYPE_OK) {
|
||||||
USB_ERR("usb_thread could not read dev descr");
|
USB_ERR("usb_thread could not read dev descr");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set size of control endpoint
|
// set size of control endpoint
|
||||||
devices[i].setSizeControlEndpoint(buf[7]);
|
devices[i].setSizeControlEndpoint(buf[7]);
|
||||||
|
|
||||||
// second step: set an address to the device
|
// second step: set an address to the device
|
||||||
res = setAddress(&devices[i], devices[i].getAddress());
|
res = setAddress(&devices[i], devices[i].getAddress());
|
||||||
|
|
||||||
if (res != USB_TYPE_OK) {
|
if (res != USB_TYPE_OK) {
|
||||||
USB_ERR("SET ADDR FAILED");
|
USB_ERR("SET ADDR FAILED");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
devices[i].activeAddress(true);
|
devices[i].activeAddress(true);
|
||||||
USB_DBG("Address of %p: %d", &devices[i], devices[i].getAddress());
|
USB_DBG("Address of %p: %d", &devices[i], devices[i].getAddress());
|
||||||
|
|
||||||
// try to read again the device descriptor to check if the device
|
// try to read again the device descriptor to check if the device
|
||||||
// answers to its new address
|
// answers to its new address
|
||||||
res = getDeviceDescriptor(&devices[i], buf, 8);
|
res = getDeviceDescriptor(&devices[i], buf, 8);
|
||||||
|
|
||||||
if (res == USB_TYPE_OK) {
|
if (res == USB_TYPE_OK) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread::wait(100);
|
Thread::wait(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_INFO("New device connected: %p [hub: %d - port: %d]", &devices[i], usb_msg->hub, usb_msg->port);
|
USB_INFO("New device connected: %p [hub: %d - port: %d]", &devices[i], usb_msg->hub, usb_msg->port);
|
||||||
|
|
||||||
#if MAX_HUB_NB
|
#if MAX_HUB_NB
|
||||||
if (buf[4] == HUB_CLASS) {
|
if (buf[4] == HUB_CLASS) {
|
||||||
for (k = 0; k < MAX_HUB_NB; k++) {
|
for (k = 0; k < MAX_HUB_NB; k++) {
|
||||||
|
@ -169,49 +169,49 @@ void USBHost::usb_process() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (k == MAX_HUB_NB) {
|
if (k == MAX_HUB_NB) {
|
||||||
USB_ERR("Too many hubs connected!!\r\n");
|
USB_ERR("Too many hubs connected!!\r\n");
|
||||||
too_many_hub = true;
|
too_many_hub = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usb_msg->hub_parent)
|
if (usb_msg->hub_parent)
|
||||||
((USBHostHub *)(usb_msg->hub_parent))->deviceConnected(&devices[i]);
|
((USBHostHub *)(usb_msg->hub_parent))->deviceConnected(&devices[i]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((i < MAX_DEVICE_CONNECTED) && !too_many_hub) {
|
if ((i < MAX_DEVICE_CONNECTED) && !too_many_hub) {
|
||||||
deviceInUse[i] = true;
|
deviceInUse[i] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// a device has been disconnected
|
// a device has been disconnected
|
||||||
case DEVICE_DISCONNECTED_EVENT:
|
case DEVICE_DISCONNECTED_EVENT:
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
Lock lock(this);
|
Lock lock(this);
|
||||||
|
|
||||||
controlListState = disableList(CONTROL_ENDPOINT);
|
controlListState = disableList(CONTROL_ENDPOINT);
|
||||||
bulkListState = disableList(BULK_ENDPOINT);
|
bulkListState = disableList(BULK_ENDPOINT);
|
||||||
interruptListState = disableList(INTERRUPT_ENDPOINT);
|
interruptListState = disableList(INTERRUPT_ENDPOINT);
|
||||||
|
|
||||||
idx = findDevice(usb_msg->hub, usb_msg->port, (USBHostHub *)(usb_msg->hub_parent));
|
idx = findDevice(usb_msg->hub, usb_msg->port, (USBHostHub *)(usb_msg->hub_parent));
|
||||||
if (idx != -1) {
|
if (idx != -1) {
|
||||||
freeDevice((USBDeviceConnected*)&devices[idx]);
|
freeDevice((USBDeviceConnected*)&devices[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (controlListState) enableList(CONTROL_ENDPOINT);
|
if (controlListState) enableList(CONTROL_ENDPOINT);
|
||||||
if (bulkListState) enableList(BULK_ENDPOINT);
|
if (bulkListState) enableList(BULK_ENDPOINT);
|
||||||
if (interruptListState) enableList(INTERRUPT_ENDPOINT);
|
if (interruptListState) enableList(INTERRUPT_ENDPOINT);
|
||||||
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// a td has been processed
|
// a td has been processed
|
||||||
// call callback on the ed associated to the td
|
// call callback on the ed associated to the td
|
||||||
// we are not in ISR -> users can use printf in their callback method
|
// we are not in ISR -> users can use printf in their callback method
|
||||||
|
@ -241,7 +241,7 @@ void USBHost::usb_process() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mail_usb_event.free(usb_msg);
|
mail_usb_event.free(usb_msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -272,7 +272,7 @@ USBHost::USBHost() : usbThread(USBHost::usb_process_static, (void *)this, osPrio
|
||||||
for (uint8_t j = 0; j < MAX_INTF; j++)
|
for (uint8_t j = 0; j < MAX_INTF; j++)
|
||||||
deviceAttachedDriver[i][j] = false;
|
deviceAttachedDriver[i][j] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MAX_HUB_NB
|
#if MAX_HUB_NB
|
||||||
for (uint8_t i = 0; i < MAX_HUB_NB; i++) {
|
for (uint8_t i = 0; i < MAX_HUB_NB; i++) {
|
||||||
hubs[i].setHost(this);
|
hubs[i].setHost(this);
|
||||||
|
@ -313,7 +313,7 @@ void USBHost::transferCompleted(volatile uint32_t addr)
|
||||||
tdList = (volatile HCTD*)td->nextTD; //Dequeue element now as it could be modified below
|
tdList = (volatile HCTD*)td->nextTD; //Dequeue element now as it could be modified below
|
||||||
if (td->ep != NULL) {
|
if (td->ep != NULL) {
|
||||||
USBEndpoint * ep = (USBEndpoint *)(td->ep);
|
USBEndpoint * ep = (USBEndpoint *)(td->ep);
|
||||||
|
|
||||||
if (((HCTD *)td)->control >> 28) {
|
if (((HCTD *)td)->control >> 28) {
|
||||||
state = ((HCTD *)td)->control >> 28;
|
state = ((HCTD *)td)->control >> 28;
|
||||||
} else {
|
} else {
|
||||||
|
@ -321,9 +321,9 @@ void USBHost::transferCompleted(volatile uint32_t addr)
|
||||||
ep->setLengthTransferred((uint32_t)td->currBufPtr - (uint32_t)ep->getBufStart());
|
ep->setLengthTransferred((uint32_t)td->currBufPtr - (uint32_t)ep->getBufStart());
|
||||||
state = 16 /*USB_TYPE_IDLE*/;
|
state = 16 /*USB_TYPE_IDLE*/;
|
||||||
}
|
}
|
||||||
|
|
||||||
ep->unqueueTransfer(td);
|
ep->unqueueTransfer(td);
|
||||||
|
|
||||||
if (ep->getType() != CONTROL_ENDPOINT) {
|
if (ep->getType() != CONTROL_ENDPOINT) {
|
||||||
// callback on the processed td will be called from the usb_thread (not in ISR)
|
// callback on the processed td will be called from the usb_thread (not in ISR)
|
||||||
message_t * usb_msg = mail_usb_event.alloc();
|
message_t * usb_msg = mail_usb_event.alloc();
|
||||||
|
@ -360,7 +360,7 @@ USBHost * USBHost::getHostInst()
|
||||||
if (deviceInited[idx])
|
if (deviceInited[idx])
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
message_t * usb_msg = mail_usb_event.alloc();
|
message_t * usb_msg = mail_usb_event.alloc();
|
||||||
usb_msg->event_id = DEVICE_CONNECTED_EVENT;
|
usb_msg->event_id = DEVICE_CONNECTED_EVENT;
|
||||||
usb_msg->hub = hub;
|
usb_msg->hub = hub;
|
||||||
|
@ -384,7 +384,7 @@ USBHost * USBHost::getHostInst()
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
message_t * usb_msg = mail_usb_event.alloc();
|
message_t * usb_msg = mail_usb_event.alloc();
|
||||||
usb_msg->event_id = DEVICE_DISCONNECTED_EVENT;
|
usb_msg->event_id = DEVICE_DISCONNECTED_EVENT;
|
||||||
usb_msg->hub = hub;
|
usb_msg->hub = hub;
|
||||||
|
@ -397,7 +397,7 @@ void USBHost::freeDevice(USBDeviceConnected * dev)
|
||||||
{
|
{
|
||||||
USBEndpoint * ep = NULL;
|
USBEndpoint * ep = NULL;
|
||||||
HCED * ed = NULL;
|
HCED * ed = NULL;
|
||||||
|
|
||||||
#if MAX_HUB_NB
|
#if MAX_HUB_NB
|
||||||
if (dev->getClass() == HUB_CLASS) {
|
if (dev->getClass() == HUB_CLASS) {
|
||||||
if (dev->hub == NULL) {
|
if (dev->hub == NULL) {
|
||||||
|
@ -412,13 +412,13 @@ void USBHost::freeDevice(USBDeviceConnected * dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// notify hub parent that this device has been disconnected
|
// notify hub parent that this device has been disconnected
|
||||||
if (dev->getHubParent())
|
if (dev->getHubParent())
|
||||||
dev->getHubParent()->deviceDisconnected(dev);
|
dev->getHubParent()->deviceDisconnected(dev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int idx = findDevice(dev);
|
int idx = findDevice(dev);
|
||||||
if (idx != -1) {
|
if (idx != -1) {
|
||||||
deviceInUse[idx] = false;
|
deviceInUse[idx] = false;
|
||||||
|
@ -481,7 +481,7 @@ void USBHost::unqueueEndpoint(USBEndpoint * ep)
|
||||||
updateInterruptHeadED(0);
|
updateInterruptHeadED(0);
|
||||||
headInterruptEndpoint = current->nextEndpoint();
|
headInterruptEndpoint = current->nextEndpoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
// modify tail
|
// modify tail
|
||||||
switch (current->getType()) {
|
switch (current->getType()) {
|
||||||
case BULK_ENDPOINT:
|
case BULK_ENDPOINT:
|
||||||
|
@ -553,7 +553,7 @@ USB_TYPE USBHost::resetDevice(USBDeviceConnected * dev)
|
||||||
deviceReset[index] = true;
|
deviceReset[index] = true;
|
||||||
return USB_TYPE_OK;
|
return USB_TYPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return USB_TYPE_ERROR;
|
return USB_TYPE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,7 +577,7 @@ bool USBHost::addEndpoint(USBDeviceConnected * dev, uint8_t intf_nb, USBEndpoint
|
||||||
if ((dev != NULL) && dev->getSpeed()) {
|
if ((dev != NULL) && dev->getSpeed()) {
|
||||||
ep->setSpeed(dev->getSpeed());
|
ep->setSpeed(dev->getSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
ep->setIntfNb(intf_nb);
|
ep->setIntfNb(intf_nb);
|
||||||
|
|
||||||
// queue the new USBEndpoint on the ED list
|
// queue the new USBEndpoint on the ED list
|
||||||
|
@ -626,7 +626,7 @@ bool USBHost::addEndpoint(USBDeviceConnected * dev, uint8_t intf_nb, USBEndpoint
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ep->dev = dev;
|
ep->dev = dev;
|
||||||
dev->addEndpoint(intf_nb, ep);
|
dev->addEndpoint(intf_nb, ep);
|
||||||
|
|
||||||
|
@ -733,7 +733,7 @@ USB_TYPE USBHost::addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len)
|
||||||
ed->queueTransfer();
|
ed->queueTransfer();
|
||||||
printList(type);
|
printList(type);
|
||||||
enableList(type);
|
enableList(type);
|
||||||
|
|
||||||
td_mutex.unlock();
|
td_mutex.unlock();
|
||||||
|
|
||||||
return USB_TYPE_PROCESSING;
|
return USB_TYPE_PROCESSING;
|
||||||
|
@ -750,7 +750,7 @@ USB_TYPE USBHost::getDeviceDescriptor(USBDeviceConnected * dev, uint8_t * buf, u
|
||||||
0, buf, MIN(DEVICE_DESCRIPTOR_LENGTH, max_len_buf));
|
0, buf, MIN(DEVICE_DESCRIPTOR_LENGTH, max_len_buf));
|
||||||
if (len_dev_descr)
|
if (len_dev_descr)
|
||||||
*len_dev_descr = MIN(DEVICE_DESCRIPTOR_LENGTH, max_len_buf);
|
*len_dev_descr = MIN(DEVICE_DESCRIPTOR_LENGTH, max_len_buf);
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -772,10 +772,10 @@ USB_TYPE USBHost::getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t *
|
||||||
}
|
}
|
||||||
total_conf_descr_length = buf[2] | (buf[3] << 8);
|
total_conf_descr_length = buf[2] | (buf[3] << 8);
|
||||||
total_conf_descr_length = MIN(max_len_buf, total_conf_descr_length);
|
total_conf_descr_length = MIN(max_len_buf, total_conf_descr_length);
|
||||||
|
|
||||||
if (len_conf_descr)
|
if (len_conf_descr)
|
||||||
*len_conf_descr = total_conf_descr_length;
|
*len_conf_descr = total_conf_descr_length;
|
||||||
|
|
||||||
USB_DBG("TOTAL_LENGTH: %d \t NUM_INTERF: %d", total_conf_descr_length, buf[4]);
|
USB_DBG("TOTAL_LENGTH: %d \t NUM_INTERF: %d", total_conf_descr_length, buf[4]);
|
||||||
|
|
||||||
return controlRead( dev,
|
return controlRead( dev,
|
||||||
|
@ -792,7 +792,7 @@ USB_TYPE USBHost::setAddress(USBDeviceConnected * dev, uint8_t address) {
|
||||||
SET_ADDRESS,
|
SET_ADDRESS,
|
||||||
address,
|
address,
|
||||||
0, NULL, 0);
|
0, NULL, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_TYPE USBHost::setConfiguration(USBDeviceConnected * dev, uint8_t conf)
|
USB_TYPE USBHost::setConfiguration(USBDeviceConnected * dev, uint8_t conf)
|
||||||
|
@ -821,18 +821,18 @@ USB_TYPE USBHost::enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerato
|
||||||
{
|
{
|
||||||
uint16_t total_conf_descr_length = 0;
|
uint16_t total_conf_descr_length = 0;
|
||||||
USB_TYPE res;
|
USB_TYPE res;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
Lock lock(this);
|
Lock lock(this);
|
||||||
|
|
||||||
// don't enumerate a device which all interfaces are registered to a specific driver
|
// don't enumerate a device which all interfaces are registered to a specific driver
|
||||||
int index = findDevice(dev);
|
int index = findDevice(dev);
|
||||||
|
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
return USB_TYPE_ERROR;
|
return USB_TYPE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t nb_intf_attached = numberDriverAttached(dev);
|
uint8_t nb_intf_attached = numberDriverAttached(dev);
|
||||||
USB_DBG("dev: %p nb_intf: %d", dev, dev->getNbIntf());
|
USB_DBG("dev: %p nb_intf: %d", dev, dev->getNbIntf());
|
||||||
USB_DBG("dev: %p nb_intf_attached: %d", dev, nb_intf_attached);
|
USB_DBG("dev: %p nb_intf_attached: %d", dev, nb_intf_attached);
|
||||||
|
@ -840,9 +840,9 @@ USB_TYPE USBHost::enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerato
|
||||||
USB_DBG("Don't enumerate dev: %p because all intf are registered with a driver", dev);
|
USB_DBG("Don't enumerate dev: %p because all intf are registered with a driver", dev);
|
||||||
return USB_TYPE_OK;
|
return USB_TYPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_DBG("Enumerate dev: %p", dev);
|
USB_DBG("Enumerate dev: %p", dev);
|
||||||
|
|
||||||
// third step: get the whole device descriptor to see vid, pid
|
// third step: get the whole device descriptor to see vid, pid
|
||||||
res = getDeviceDescriptor(dev, data, DEVICE_DESCRIPTOR_LENGTH);
|
res = getDeviceDescriptor(dev, data, DEVICE_DESCRIPTOR_LENGTH);
|
||||||
|
|
||||||
|
@ -850,7 +850,7 @@ USB_TYPE USBHost::enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerato
|
||||||
USB_DBG("GET DEV DESCR FAILED");
|
USB_DBG("GET DEV DESCR FAILED");
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->setClass(data[4]);
|
dev->setClass(data[4]);
|
||||||
dev->setSubClass(data[5]);
|
dev->setSubClass(data[5]);
|
||||||
dev->setProtocol(data[6]);
|
dev->setProtocol(data[6]);
|
||||||
|
@ -877,7 +877,7 @@ USB_TYPE USBHost::enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerato
|
||||||
|
|
||||||
// only set configuration if not enumerated before
|
// only set configuration if not enumerated before
|
||||||
if (!dev->isEnumerated()) {
|
if (!dev->isEnumerated()) {
|
||||||
|
|
||||||
USB_DBG("Set configuration 1 on dev: %p", dev);
|
USB_DBG("Set configuration 1 on dev: %p", dev);
|
||||||
// sixth step: set configuration (only 1 supported)
|
// sixth step: set configuration (only 1 supported)
|
||||||
res = setConfiguration(dev, 1);
|
res = setConfiguration(dev, 1);
|
||||||
|
@ -887,12 +887,12 @@ USB_TYPE USBHost::enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerato
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->setEnumerated();
|
dev->setEnumerated();
|
||||||
|
|
||||||
// Now the device is enumerated!
|
// Now the device is enumerated!
|
||||||
USB_DBG("dev %p is enumerated\r\n", dev);
|
USB_DBG("dev %p is enumerated\r\n", dev);
|
||||||
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
// Some devices may require this delay
|
// Some devices may require this delay
|
||||||
|
@ -991,17 +991,17 @@ USB_TYPE USBHost::interruptRead(USBDeviceConnected * dev, USBEndpoint * ep, uint
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking, ENDPOINT_TYPE type, bool write) {
|
USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking, ENDPOINT_TYPE type, bool write) {
|
||||||
|
|
||||||
#if DEBUG_TRANSFER
|
#if DEBUG_TRANSFER
|
||||||
const char * type_str = (type == BULK_ENDPOINT) ? "BULK" : ((type == INTERRUPT_ENDPOINT) ? "INTERRUPT" : "ISOCHRONOUS");
|
const char * type_str = (type == BULK_ENDPOINT) ? "BULK" : ((type == INTERRUPT_ENDPOINT) ? "INTERRUPT" : "ISOCHRONOUS");
|
||||||
USB_DBG_TRANSFER("----- %s %s [dev: %p - %s - hub: %d - port: %d - addr: %d - ep: %02X]------", type_str, (write) ? "WRITE" : "READ", dev, dev->getName(ep->getIntfNb()), dev->getHub(), dev->getPort(), dev->getAddress(), ep->getAddress());
|
USB_DBG_TRANSFER("----- %s %s [dev: %p - %s - hub: %d - port: %d - addr: %d - ep: %02X]------", type_str, (write) ? "WRITE" : "READ", dev, dev->getName(ep->getIntfNb()), dev->getHub(), dev->getPort(), dev->getAddress(), ep->getAddress());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Lock lock(this);
|
Lock lock(this);
|
||||||
|
|
||||||
USB_TYPE res;
|
USB_TYPE res;
|
||||||
ENDPOINT_DIRECTION dir = (write) ? OUT : IN;
|
ENDPOINT_DIRECTION dir = (write) ? OUT : IN;
|
||||||
|
|
||||||
if (dev == NULL) {
|
if (dev == NULL) {
|
||||||
USB_ERR("dev NULL");
|
USB_ERR("dev NULL");
|
||||||
return USB_TYPE_ERROR;
|
return USB_TYPE_ERROR;
|
||||||
|
@ -1026,7 +1026,7 @@ USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, ui
|
||||||
USB_ERR("[ep: %p - dev: %p] USBEndpoint addr and device addr don't match", ep, ep->dev);
|
USB_ERR("[ep: %p - dev: %p] USBEndpoint addr and device addr don't match", ep, ep->dev);
|
||||||
return USB_TYPE_ERROR;
|
return USB_TYPE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG_TRANSFER
|
#if DEBUG_TRANSFER
|
||||||
if (write) {
|
if (write) {
|
||||||
USB_DBG_TRANSFER("%s WRITE buffer", type_str);
|
USB_DBG_TRANSFER("%s WRITE buffer", type_str);
|
||||||
|
@ -1038,19 +1038,19 @@ USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, ui
|
||||||
addTransfer(ep, buf, len);
|
addTransfer(ep, buf, len);
|
||||||
|
|
||||||
if (blocking) {
|
if (blocking) {
|
||||||
|
|
||||||
ep->ep_queue.get();
|
ep->ep_queue.get();
|
||||||
res = ep->getState();
|
res = ep->getState();
|
||||||
|
|
||||||
USB_DBG_TRANSFER("%s TRANSFER res: %s on ep: %p\r\n", type_str, ep->getStateString(), ep);
|
USB_DBG_TRANSFER("%s TRANSFER res: %s on ep: %p\r\n", type_str, ep->getStateString(), ep);
|
||||||
|
|
||||||
if (res != USB_TYPE_IDLE) {
|
if (res != USB_TYPE_IDLE) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
return USB_TYPE_OK;
|
return USB_TYPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return USB_TYPE_PROCESSING;
|
return USB_TYPE_PROCESSING;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
* Static method to create or retrieve the single USBHost instance
|
* Static method to create or retrieve the single USBHost instance
|
||||||
*/
|
*/
|
||||||
static USBHost * getHostInst();
|
static USBHost * getHostInst();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Control read: setup stage, data stage and status stage
|
* Control read: setup stage, data stage and status stage
|
||||||
*
|
*
|
||||||
|
@ -186,19 +186,19 @@ public:
|
||||||
dev->onDisconnect(intf, fn);
|
dev->onDisconnect(intf, fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiate to protect USB thread from accessing shared objects (USBConnectedDevices and Interfaces)
|
* Instantiate to protect USB thread from accessing shared objects (USBConnectedDevices and Interfaces)
|
||||||
*/
|
*/
|
||||||
class Lock
|
class Lock
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Lock(USBHost* pHost);
|
Lock(USBHost* pHost);
|
||||||
~Lock();
|
~Lock();
|
||||||
private:
|
private:
|
||||||
USBHost* m_pHost;
|
USBHost* m_pHost;
|
||||||
};
|
};
|
||||||
|
|
||||||
friend class USBHostHub;
|
friend class USBHostHub;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -257,7 +257,7 @@ private:
|
||||||
bool deviceAttachedDriver[MAX_DEVICE_CONNECTED][MAX_INTF];
|
bool deviceAttachedDriver[MAX_DEVICE_CONNECTED][MAX_INTF];
|
||||||
bool deviceReset[MAX_DEVICE_CONNECTED];
|
bool deviceReset[MAX_DEVICE_CONNECTED];
|
||||||
bool deviceInited[MAX_DEVICE_CONNECTED];
|
bool deviceInited[MAX_DEVICE_CONNECTED];
|
||||||
|
|
||||||
#if MAX_HUB_NB
|
#if MAX_HUB_NB
|
||||||
USBHostHub hubs[MAX_HUB_NB];
|
USBHostHub hubs[MAX_HUB_NB];
|
||||||
bool hub_in_use[MAX_HUB_NB];
|
bool hub_in_use[MAX_HUB_NB];
|
||||||
|
@ -265,7 +265,7 @@ private:
|
||||||
|
|
||||||
// to store a setup packet
|
// to store a setup packet
|
||||||
uint8_t setupPacket[8];
|
uint8_t setupPacket[8];
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t event_id;
|
uint8_t event_id;
|
||||||
void * td_addr;
|
void * td_addr;
|
||||||
|
@ -275,17 +275,17 @@ private:
|
||||||
uint8_t td_state;
|
uint8_t td_state;
|
||||||
void * hub_parent;
|
void * hub_parent;
|
||||||
} message_t;
|
} message_t;
|
||||||
|
|
||||||
Thread usbThread;
|
Thread usbThread;
|
||||||
void usb_process();
|
void usb_process();
|
||||||
static void usb_process_static(void const * arg);
|
static void usb_process_static(void const * arg);
|
||||||
Mail<message_t, 10> mail_usb_event;
|
Mail<message_t, 10> mail_usb_event;
|
||||||
Mutex usb_mutex;
|
Mutex usb_mutex;
|
||||||
Mutex td_mutex;
|
Mutex td_mutex;
|
||||||
|
|
||||||
// buffer for conf descriptor
|
// buffer for conf descriptor
|
||||||
uint8_t data[415];
|
uint8_t data[415];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a transfer on the TD linked list associated to an ED
|
* Add a transfer on the TD linked list associated to an ED
|
||||||
*
|
*
|
||||||
|
@ -296,7 +296,7 @@ private:
|
||||||
* @return status of the transfer
|
* @return status of the transfer
|
||||||
*/
|
*/
|
||||||
USB_TYPE addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) ;
|
USB_TYPE addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Link the USBEndpoint to the linked list and attach an USBEndpoint this USBEndpoint to a device
|
* Link the USBEndpoint to the linked list and attach an USBEndpoint this USBEndpoint to a device
|
||||||
*
|
*
|
||||||
|
@ -318,7 +318,7 @@ private:
|
||||||
* @returns pointer on the USBEndpoint created
|
* @returns pointer on the USBEndpoint created
|
||||||
*/
|
*/
|
||||||
USBEndpoint * newEndpoint(ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t addr) ;
|
USBEndpoint * newEndpoint(ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t addr) ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request the device descriptor
|
* Request the device descriptor
|
||||||
*
|
*
|
||||||
|
@ -338,7 +338,7 @@ private:
|
||||||
* @param len_conf_descr pointer to store the length of the packet transferred
|
* @param len_conf_descr pointer to store the length of the packet transferred
|
||||||
*/
|
*/
|
||||||
USB_TYPE getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_conf_descr = NULL);
|
USB_TYPE getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_conf_descr = NULL);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the address of a specific device
|
* Set the address of a specific device
|
||||||
*
|
*
|
||||||
|
@ -354,7 +354,7 @@ private:
|
||||||
* @param conf configuration number to activate (usually 1)
|
* @param conf configuration number to activate (usually 1)
|
||||||
*/
|
*/
|
||||||
USB_TYPE setConfiguration(USBDeviceConnected * dev, uint8_t conf);
|
USB_TYPE setConfiguration(USBDeviceConnected * dev, uint8_t conf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a specific device
|
* Free a specific device
|
||||||
*
|
*
|
||||||
|
@ -378,7 +378,7 @@ private:
|
||||||
bool blocking,
|
bool blocking,
|
||||||
ENDPOINT_TYPE type,
|
ENDPOINT_TYPE type,
|
||||||
bool write) ;
|
bool write) ;
|
||||||
|
|
||||||
void fillControlBuf(uint8_t requestType, uint8_t request, uint16_t value, uint16_t index, int len) ;
|
void fillControlBuf(uint8_t requestType, uint8_t request, uint16_t value, uint16_t index, int len) ;
|
||||||
void parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator) ;
|
void parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator) ;
|
||||||
int findDevice(USBDeviceConnected * dev) ;
|
int findDevice(USBDeviceConnected * dev) ;
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
/*
|
/*
|
||||||
* Enable USB3Gmodule
|
* Enable USB3Gmodule
|
||||||
*/
|
*/
|
||||||
#define USBHOST_3GMODULE 1
|
#define USBHOST_3GMODULE 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Maximum number of interfaces of a usb device
|
* Maximum number of interfaces of a usb device
|
||||||
|
|
|
@ -67,28 +67,28 @@ enum ENDPOINT_TYPE {
|
||||||
#define HUB_CLASS 0x09
|
#define HUB_CLASS 0x09
|
||||||
#define SERIAL_CLASS 0x0A
|
#define SERIAL_CLASS 0x0A
|
||||||
|
|
||||||
// ------------------ HcControl Register ---------------------
|
// ------------------ HcControl Register ---------------------
|
||||||
#define OR_CONTROL_PLE 0x00000004
|
#define OR_CONTROL_PLE 0x00000004
|
||||||
#define OR_CONTROL_CLE 0x00000010
|
#define OR_CONTROL_CLE 0x00000010
|
||||||
#define OR_CONTROL_BLE 0x00000020
|
#define OR_CONTROL_BLE 0x00000020
|
||||||
#define OR_CONTROL_HCFS 0x000000C0
|
#define OR_CONTROL_HCFS 0x000000C0
|
||||||
#define OR_CONTROL_HC_OPER 0x00000080
|
#define OR_CONTROL_HC_OPER 0x00000080
|
||||||
// ----------------- HcCommandStatus Register -----------------
|
// ----------------- HcCommandStatus Register -----------------
|
||||||
#define OR_CMD_STATUS_HCR 0x00000001
|
#define OR_CMD_STATUS_HCR 0x00000001
|
||||||
#define OR_CMD_STATUS_CLF 0x00000002
|
#define OR_CMD_STATUS_CLF 0x00000002
|
||||||
#define OR_CMD_STATUS_BLF 0x00000004
|
#define OR_CMD_STATUS_BLF 0x00000004
|
||||||
// --------------- HcInterruptStatus Register -----------------
|
// --------------- HcInterruptStatus Register -----------------
|
||||||
#define OR_INTR_STATUS_WDH 0x00000002
|
#define OR_INTR_STATUS_WDH 0x00000002
|
||||||
#define OR_INTR_STATUS_RHSC 0x00000040
|
#define OR_INTR_STATUS_RHSC 0x00000040
|
||||||
#define OR_INTR_STATUS_UE 0x00000010
|
#define OR_INTR_STATUS_UE 0x00000010
|
||||||
// --------------- HcInterruptEnable Register -----------------
|
// --------------- HcInterruptEnable Register -----------------
|
||||||
#define OR_INTR_ENABLE_WDH 0x00000002
|
#define OR_INTR_ENABLE_WDH 0x00000002
|
||||||
#define OR_INTR_ENABLE_RHSC 0x00000040
|
#define OR_INTR_ENABLE_RHSC 0x00000040
|
||||||
#define OR_INTR_ENABLE_MIE 0x80000000
|
#define OR_INTR_ENABLE_MIE 0x80000000
|
||||||
// ---------------- HcRhDescriptorA Register ------------------
|
// ---------------- HcRhDescriptorA Register ------------------
|
||||||
#define OR_RH_STATUS_LPSC 0x00010000
|
#define OR_RH_STATUS_LPSC 0x00010000
|
||||||
#define OR_RH_STATUS_DRWE 0x00008000
|
#define OR_RH_STATUS_DRWE 0x00008000
|
||||||
// -------------- HcRhPortStatus[1:NDP] Register --------------
|
// -------------- HcRhPortStatus[1:NDP] Register --------------
|
||||||
#define OR_RH_PORT_CCS 0x00000001
|
#define OR_RH_PORT_CCS 0x00000001
|
||||||
#define OR_RH_PORT_PRS 0x00000010
|
#define OR_RH_PORT_PRS 0x00000010
|
||||||
#define OR_RH_PORT_CSC 0x00010000
|
#define OR_RH_PORT_CSC 0x00010000
|
||||||
|
@ -100,14 +100,14 @@ enum ENDPOINT_TYPE {
|
||||||
|
|
||||||
#define ED_SKIP (uint32_t) (0x00001000) // Skip this ep in queue
|
#define ED_SKIP (uint32_t) (0x00001000) // Skip this ep in queue
|
||||||
|
|
||||||
#define TD_ROUNDING (uint32_t) (0x00040000) // Buffer Rounding
|
#define TD_ROUNDING (uint32_t) (0x00040000) // Buffer Rounding
|
||||||
#define TD_SETUP (uint32_t)(0) // Direction of Setup Packet
|
#define TD_SETUP (uint32_t)(0) // Direction of Setup Packet
|
||||||
#define TD_IN (uint32_t)(0x00100000) // Direction In
|
#define TD_IN (uint32_t)(0x00100000) // Direction In
|
||||||
#define TD_OUT (uint32_t)(0x00080000) // Direction Out
|
#define TD_OUT (uint32_t)(0x00080000) // Direction Out
|
||||||
#define TD_DELAY_INT(x) (uint32_t)((x) << 21) // Delay Interrupt
|
#define TD_DELAY_INT(x) (uint32_t)((x) << 21) // Delay Interrupt
|
||||||
#define TD_TOGGLE_0 (uint32_t)(0x02000000) // Toggle 0
|
#define TD_TOGGLE_0 (uint32_t)(0x02000000) // Toggle 0
|
||||||
#define TD_TOGGLE_1 (uint32_t)(0x03000000) // Toggle 1
|
#define TD_TOGGLE_1 (uint32_t)(0x03000000) // Toggle 1
|
||||||
#define TD_CC (uint32_t)(0xF0000000) // Completion Code
|
#define TD_CC (uint32_t)(0xF0000000) // Completion Code
|
||||||
|
|
||||||
#define DEVICE_DESCRIPTOR (1)
|
#define DEVICE_DESCRIPTOR (1)
|
||||||
#define CONFIGURATION_DESCRIPTOR (2)
|
#define CONFIGURATION_DESCRIPTOR (2)
|
||||||
|
@ -115,7 +115,7 @@ enum ENDPOINT_TYPE {
|
||||||
#define ENDPOINT_DESCRIPTOR (5)
|
#define ENDPOINT_DESCRIPTOR (5)
|
||||||
#define HID_DESCRIPTOR (33)
|
#define HID_DESCRIPTOR (33)
|
||||||
|
|
||||||
// ----------- Control RequestType Fields -----------
|
// ----------- Control RequestType Fields -----------
|
||||||
#define USB_DEVICE_TO_HOST 0x80
|
#define USB_DEVICE_TO_HOST 0x80
|
||||||
#define USB_HOST_TO_DEVICE 0x00
|
#define USB_HOST_TO_DEVICE 0x00
|
||||||
#define USB_REQUEST_TYPE_CLASS 0x20
|
#define USB_REQUEST_TYPE_CLASS 0x20
|
||||||
|
@ -124,14 +124,14 @@ enum ENDPOINT_TYPE {
|
||||||
#define USB_RECIPIENT_INTERFACE 0x01
|
#define USB_RECIPIENT_INTERFACE 0x01
|
||||||
#define USB_RECIPIENT_ENDPOINT 0x02
|
#define USB_RECIPIENT_ENDPOINT 0x02
|
||||||
|
|
||||||
// -------------- USB Standard Requests --------------
|
// -------------- USB Standard Requests --------------
|
||||||
#define SET_ADDRESS 0x05
|
#define SET_ADDRESS 0x05
|
||||||
#define GET_DESCRIPTOR 0x06
|
#define GET_DESCRIPTOR 0x06
|
||||||
#define SET_CONFIGURATION 0x09
|
#define SET_CONFIGURATION 0x09
|
||||||
#define SET_INTERFACE 0x0b
|
#define SET_INTERFACE 0x0b
|
||||||
#define CLEAR_FEATURE 0x01
|
#define CLEAR_FEATURE 0x01
|
||||||
|
|
||||||
// -------------- USB Descriptor Length --------------
|
// -------------- USB Descriptor Length --------------
|
||||||
#define DEVICE_DESCRIPTOR_LENGTH 0x12
|
#define DEVICE_DESCRIPTOR_LENGTH 0x12
|
||||||
#define CONFIGURATION_DESCRIPTOR_LENGTH 0x09
|
#define CONFIGURATION_DESCRIPTOR_LENGTH 0x09
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ typedef struct HCTD {
|
||||||
uint32_t dummy[3]; // padding
|
uint32_t dummy[3]; // padding
|
||||||
} PACKED HCTD;
|
} PACKED HCTD;
|
||||||
|
|
||||||
// ----------- HostController EndPoint Descriptor -------------
|
// ----------- HostController EndPoint Descriptor -------------
|
||||||
typedef struct hcEd {
|
typedef struct hcEd {
|
||||||
__IO uint32_t control; // Endpoint descriptor control
|
__IO uint32_t control; // Endpoint descriptor control
|
||||||
__IO HCTD * tailTD; // Physical address of tail in Transfer descriptor list
|
__IO HCTD * tailTD; // Physical address of tail in Transfer descriptor list
|
||||||
|
@ -154,73 +154,73 @@ typedef struct hcEd {
|
||||||
} PACKED HCED;
|
} PACKED HCED;
|
||||||
|
|
||||||
|
|
||||||
// ----------- Host Controller Communication Area ------------
|
// ----------- Host Controller Communication Area ------------
|
||||||
typedef struct hcca {
|
typedef struct hcca {
|
||||||
__IO uint32_t IntTable[32]; // Interrupt Table
|
__IO uint32_t IntTable[32]; // Interrupt Table
|
||||||
__IO uint32_t FrameNumber; // Frame Number
|
__IO uint32_t FrameNumber; // Frame Number
|
||||||
__IO uint32_t DoneHead; // Done Head
|
__IO uint32_t DoneHead; // Done Head
|
||||||
volatile uint8_t Reserved[116]; // Reserved for future use
|
volatile uint8_t Reserved[116]; // Reserved for future use
|
||||||
volatile uint8_t Unknown[4]; // Unused
|
volatile uint8_t Unknown[4]; // Unused
|
||||||
} PACKED HCCA;
|
} PACKED HCCA;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t bLength;
|
uint8_t bLength;
|
||||||
uint8_t bDescriptorType;
|
uint8_t bDescriptorType;
|
||||||
uint16_t bcdUSB;
|
uint16_t bcdUSB;
|
||||||
uint8_t bDeviceClass;
|
uint8_t bDeviceClass;
|
||||||
uint8_t bDeviceSubClass;
|
uint8_t bDeviceSubClass;
|
||||||
uint8_t bDeviceProtocol;
|
uint8_t bDeviceProtocol;
|
||||||
uint8_t bMaxPacketSize;
|
uint8_t bMaxPacketSize;
|
||||||
uint16_t idVendor;
|
uint16_t idVendor;
|
||||||
uint16_t idProduct;
|
uint16_t idProduct;
|
||||||
uint16_t bcdDevice;
|
uint16_t bcdDevice;
|
||||||
uint8_t iManufacturer;
|
uint8_t iManufacturer;
|
||||||
uint8_t iProduct;
|
uint8_t iProduct;
|
||||||
uint8_t iSerialNumber;
|
uint8_t iSerialNumber;
|
||||||
uint8_t bNumConfigurations;
|
uint8_t bNumConfigurations;
|
||||||
} PACKED DeviceDescriptor;
|
} PACKED DeviceDescriptor;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t bLength;
|
uint8_t bLength;
|
||||||
uint8_t bDescriptorType;
|
uint8_t bDescriptorType;
|
||||||
uint16_t wTotalLength;
|
uint16_t wTotalLength;
|
||||||
uint8_t bNumInterfaces;
|
uint8_t bNumInterfaces;
|
||||||
uint8_t bConfigurationValue;
|
uint8_t bConfigurationValue;
|
||||||
uint8_t iConfiguration;
|
uint8_t iConfiguration;
|
||||||
uint8_t bmAttributes;
|
uint8_t bmAttributes;
|
||||||
uint8_t bMaxPower;
|
uint8_t bMaxPower;
|
||||||
} PACKED ConfigurationDescriptor;
|
} PACKED ConfigurationDescriptor;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t bLength;
|
uint8_t bLength;
|
||||||
uint8_t bDescriptorType;
|
uint8_t bDescriptorType;
|
||||||
uint8_t bInterfaceNumber;
|
uint8_t bInterfaceNumber;
|
||||||
uint8_t bAlternateSetting;
|
uint8_t bAlternateSetting;
|
||||||
uint8_t bNumEndpoints;
|
uint8_t bNumEndpoints;
|
||||||
uint8_t bInterfaceClass;
|
uint8_t bInterfaceClass;
|
||||||
uint8_t bInterfaceSubClass;
|
uint8_t bInterfaceSubClass;
|
||||||
uint8_t bInterfaceProtocol;
|
uint8_t bInterfaceProtocol;
|
||||||
uint8_t iInterface;
|
uint8_t iInterface;
|
||||||
} InterfaceDescriptor;
|
} InterfaceDescriptor;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t bLength;
|
uint8_t bLength;
|
||||||
uint8_t bDescriptorType;
|
uint8_t bDescriptorType;
|
||||||
uint8_t bEndpointAddress;
|
uint8_t bEndpointAddress;
|
||||||
uint8_t bmAttributes;
|
uint8_t bmAttributes;
|
||||||
uint16_t wMaxPacketSize;
|
uint16_t wMaxPacketSize;
|
||||||
uint8_t bInterval;
|
uint8_t bInterval;
|
||||||
} EndpointDescriptor;
|
} EndpointDescriptor;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t bDescLength;
|
uint8_t bDescLength;
|
||||||
uint8_t bDescriptorType;
|
uint8_t bDescriptorType;
|
||||||
uint8_t bNbrPorts;
|
uint8_t bNbrPorts;
|
||||||
uint16_t wHubCharacteristics;
|
uint16_t wHubCharacteristics;
|
||||||
uint8_t bPwrOn2PwrGood;
|
uint8_t bPwrOn2PwrGood;
|
||||||
uint8_t bHubContrCurrent;
|
uint8_t bHubContrCurrent;
|
||||||
uint8_t DeviceRemovable;
|
uint8_t DeviceRemovable;
|
||||||
uint8_t PortPweCtrlMak;
|
uint8_t PortPweCtrlMak;
|
||||||
} HubDescriptor;
|
} HubDescriptor;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,12 +45,12 @@ bool WANDongle::tryConnect()
|
||||||
USB_DBG("Trying to connect device");
|
USB_DBG("Trying to connect device");
|
||||||
|
|
||||||
if (dev_connected) {
|
if (dev_connected) {
|
||||||
USB_DBG("Device is already connected!");
|
USB_DBG("Device is already connected!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pInitializer = NULL;
|
m_pInitializer = NULL;
|
||||||
|
|
||||||
//Protect from concurrent access from USB thread
|
//Protect from concurrent access from USB thread
|
||||||
USBHost::Lock lock(host);
|
USBHost::Lock lock(host);
|
||||||
|
|
||||||
|
@ -59,16 +59,16 @@ bool WANDongle::tryConnect()
|
||||||
if ((dev = host->getDevice(i)) != NULL)
|
if ((dev = host->getDevice(i)) != NULL)
|
||||||
{
|
{
|
||||||
m_pInitializer = NULL; //Will be set in setVidPid callback
|
m_pInitializer = NULL; //Will be set in setVidPid callback
|
||||||
|
|
||||||
USB_DBG("Enumerate");
|
USB_DBG("Enumerate");
|
||||||
int ret = host->enumerate(dev, this);
|
int ret = host->enumerate(dev, this);
|
||||||
if(ret)
|
if(ret)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_DBG("Device has VID:%04x PID:%04x", dev->getVid(), dev->getPid());
|
USB_DBG("Device has VID:%04x PID:%04x", dev->getVid(), dev->getPid());
|
||||||
|
|
||||||
if(m_pInitializer) //If an initializer has been found
|
if(m_pInitializer) //If an initializer has been found
|
||||||
{
|
{
|
||||||
USB_DBG("m_pInitializer=%p", m_pInitializer);
|
USB_DBG("m_pInitializer=%p", m_pInitializer);
|
||||||
|
@ -90,18 +90,18 @@ bool WANDongle::tryConnect()
|
||||||
USB_DBG("Ep %p", m_pInitializer->getEp(dev, j, true));
|
USB_DBG("Ep %p", m_pInitializer->getEp(dev, j, true));
|
||||||
m_serial[j].connect( dev, m_pInitializer->getEp(dev, j, false), m_pInitializer->getEp(dev, j, true) );
|
m_serial[j].connect( dev, m_pInitializer->getEp(dev, j, false), m_pInitializer->getEp(dev, j, true) );
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_DBG("Device connected");
|
USB_DBG("Device connected");
|
||||||
|
|
||||||
dev_connected = true;
|
dev_connected = true;
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if ((dev->getVid() == m_pInitializer->getMSDVid()) && (dev->getPid() == m_pInitializer->getMSDPid()))
|
else if ((dev->getVid() == m_pInitializer->getMSDVid()) && (dev->getPid() == m_pInitializer->getMSDPid()))
|
||||||
{
|
{
|
||||||
USB_DBG("Vodafone K3370 dongle detected in MSD mode");
|
USB_DBG("Vodafone K3370 dongle detected in MSD mode");
|
||||||
//Try to switch
|
//Try to switch
|
||||||
if( m_pInitializer->switchMode(dev) )
|
if( m_pInitializer->switchMode(dev) )
|
||||||
{
|
{
|
||||||
USB_DBG("Switched OK");
|
USB_DBG("Switched OK");
|
||||||
|
|
|
@ -58,47 +58,47 @@ public:
|
||||||
* @return true if a serial device is connected
|
* @return true if a serial device is connected
|
||||||
*/
|
*/
|
||||||
bool connected();
|
bool connected();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to connect device
|
* Try to connect device
|
||||||
*
|
*
|
||||||
* * @return true if connection was successful
|
* * @return true if connection was successful
|
||||||
*/
|
*/
|
||||||
bool tryConnect();
|
bool tryConnect();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disconnect device
|
* Disconnect device
|
||||||
*
|
*
|
||||||
* * @return true if disconnection was successful
|
* * @return true if disconnection was successful
|
||||||
*/
|
*/
|
||||||
bool disconnect();
|
bool disconnect();
|
||||||
|
|
||||||
int getDongleType();
|
int getDongleType();
|
||||||
|
|
||||||
IUSBHostSerial& getSerial(int index);
|
IUSBHostSerial& getSerial(int index);
|
||||||
int getSerialCount();
|
int getSerialCount();
|
||||||
bool addInitializer(WANDongleInitializer* pInitializer);
|
bool addInitializer(WANDongleInitializer* pInitializer);
|
||||||
|
|
||||||
//From IUSBEnumerator
|
//From IUSBEnumerator
|
||||||
|
|
||||||
virtual void setVidPid(uint16_t vid, uint16_t pid);
|
virtual void setVidPid(uint16_t vid, uint16_t pid);
|
||||||
|
|
||||||
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
|
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
|
||||||
|
|
||||||
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
|
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
USBHost * host;
|
USBHost * host;
|
||||||
USBDeviceConnected * dev;
|
USBDeviceConnected * dev;
|
||||||
bool dev_connected;
|
bool dev_connected;
|
||||||
|
|
||||||
WANDongleInitializer* m_pInitializer;
|
WANDongleInitializer* m_pInitializer;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
WANDongleSerialPort m_serial[WANDONGLE_MAX_SERIAL_PORTS];
|
WANDongleSerialPort m_serial[WANDONGLE_MAX_SERIAL_PORTS];
|
||||||
int m_serialCount;
|
int m_serialCount;
|
||||||
|
|
||||||
int m_totalInitializers;
|
int m_totalInitializers;
|
||||||
WANDongleInitializer* m_Initializers[WANDONGLE_MAX_INITIALIZERS];
|
WANDongleInitializer* m_Initializers[WANDONGLE_MAX_INITIALIZERS];
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,29 +40,29 @@ protected:
|
||||||
WANDongleInitializer(USBHost* pHost) { m_pHost = pHost; }
|
WANDongleInitializer(USBHost* pHost) { m_pHost = pHost; }
|
||||||
USBHost* m_pHost;
|
USBHost* m_pHost;
|
||||||
uint8_t m_serialIntfMap[WANDONGLE_MAX_SERIAL_PORTS];
|
uint8_t m_serialIntfMap[WANDONGLE_MAX_SERIAL_PORTS];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~WANDongleInitializer() {}
|
virtual ~WANDongleInitializer() {}
|
||||||
virtual uint16_t getMSDVid() = 0;
|
virtual uint16_t getMSDVid() = 0;
|
||||||
virtual uint16_t getMSDPid() = 0;
|
virtual uint16_t getMSDPid() = 0;
|
||||||
|
|
||||||
virtual uint16_t getSerialVid() = 0;
|
virtual uint16_t getSerialVid() = 0;
|
||||||
virtual uint16_t getSerialPid() = 0;
|
virtual uint16_t getSerialPid() = 0;
|
||||||
|
|
||||||
virtual bool switchMode(USBDeviceConnected* pDev) = 0;
|
virtual bool switchMode(USBDeviceConnected* pDev) = 0;
|
||||||
|
|
||||||
virtual USBEndpoint* getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx) {
|
virtual USBEndpoint* getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx) {
|
||||||
return pDev->getEndpoint(m_serialIntfMap[serialPortNumber], BULK_ENDPOINT, tx ? OUT : IN, 0);
|
return pDev->getEndpoint(m_serialIntfMap[serialPortNumber], BULK_ENDPOINT, tx ? OUT : IN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int getSerialPortCount() = 0;
|
virtual int getSerialPortCount() = 0;
|
||||||
|
|
||||||
virtual void setVidPid(uint16_t vid, uint16_t pid) = 0;
|
virtual void setVidPid(uint16_t vid, uint16_t pid) = 0;
|
||||||
|
|
||||||
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) = 0; //Must return true if the interface should be parsed
|
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) = 0; //Must return true if the interface should be parsed
|
||||||
|
|
||||||
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) = 0; //Must return true if the endpoint will be used
|
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) = 0; //Must return true if the endpoint will be used
|
||||||
|
|
||||||
virtual int getType() = 0;
|
virtual int getType() = 0;
|
||||||
|
|
||||||
virtual uint8_t getSerialIntf(int index) { return m_serialIntfMap[index]; }
|
virtual uint8_t getSerialIntf(int index) { return m_serialIntfMap[index]; }
|
||||||
|
|
|
@ -58,7 +58,7 @@ void WANDongleSerialPort::reset()
|
||||||
buf_in_read_pos = 0;
|
buf_in_read_pos = 0;
|
||||||
lock_rx = false;
|
lock_rx = false;
|
||||||
cb_rx_pending = false;
|
cb_rx_pending = false;
|
||||||
|
|
||||||
tx_mtx.unlock();
|
tx_mtx.unlock();
|
||||||
rx_mtx.unlock();
|
rx_mtx.unlock();
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ int WANDongleSerialPort::readPacket()
|
||||||
rx_mtx.unlock();
|
rx_mtx.unlock();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( bulk_in == NULL )
|
if( bulk_in == NULL )
|
||||||
{
|
{
|
||||||
USB_WARN("Port is disconnected");
|
USB_WARN("Port is disconnected");
|
||||||
|
@ -105,7 +105,7 @@ int WANDongleSerialPort::writePacket()
|
||||||
tx_mtx.unlock();
|
tx_mtx.unlock();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( bulk_out == NULL )
|
if( bulk_out == NULL )
|
||||||
{
|
{
|
||||||
USB_WARN("Port is disconnected");
|
USB_WARN("Port is disconnected");
|
||||||
|
|
|
@ -42,11 +42,11 @@ public:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
WANDongleSerialPort();
|
WANDongleSerialPort();
|
||||||
|
|
||||||
void init( USBHost* pHost );
|
void init( USBHost* pHost );
|
||||||
|
|
||||||
void connect( USBDeviceConnected* pDev, USBEndpoint* pInEp, USBEndpoint* pOutEp );
|
void connect( USBDeviceConnected* pDev, USBEndpoint* pInEp, USBEndpoint* pOutEp );
|
||||||
|
|
||||||
void disconnect( );
|
void disconnect( );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -89,13 +89,13 @@ public:
|
||||||
* @param pListener instance of the listener deriving from the IUSBHostSerialListener
|
* @param pListener instance of the listener deriving from the IUSBHostSerialListener
|
||||||
*/
|
*/
|
||||||
virtual void attach(IUSBHostSerialListener* pListener);
|
virtual void attach(IUSBHostSerialListener* pListener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable or disable readable/writeable callbacks
|
* Enable or disable readable/writeable callbacks
|
||||||
*/
|
*/
|
||||||
virtual void setupIrq(bool en, IrqType irq = RxIrq);
|
virtual void setupIrq(bool en, IrqType irq = RxIrq);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
USBEndpoint * bulk_in;
|
USBEndpoint * bulk_in;
|
||||||
USBEndpoint * bulk_out;
|
USBEndpoint * bulk_out;
|
||||||
|
@ -117,11 +117,11 @@ protected:
|
||||||
volatile bool cb_rx_en;
|
volatile bool cb_rx_en;
|
||||||
volatile bool cb_rx_pending;
|
volatile bool cb_rx_pending;
|
||||||
Mutex rx_mtx;
|
Mutex rx_mtx;
|
||||||
|
|
||||||
IUSBHostSerialListener* listener;
|
IUSBHostSerialListener* listener;
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
void rxHandler();
|
void rxHandler();
|
||||||
void txHandler();
|
void txHandler();
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
#if USBHOST_KEYBOARD
|
#if USBHOST_KEYBOARD
|
||||||
|
|
||||||
static uint8_t keymap[4][0x39] = {
|
static uint8_t keymap[4][0x39] = {
|
||||||
{ 0, 0, 0, 0, 'a', 'b' /*0x05*/,
|
{ 0, 0, 0, 0, 'a', 'b' /*0x05*/,
|
||||||
'c', 'd', 'e', 'f', 'g' /*0x0a*/,
|
'c', 'd', 'e', 'f', 'g' /*0x0a*/,
|
||||||
'h', 'i', 'j', 'k', 'l'/*0x0f*/,
|
'h', 'i', 'j', 'k', 'l'/*0x0f*/,
|
||||||
|
@ -100,30 +100,30 @@ bool USBHostKeyboard::connected() {
|
||||||
|
|
||||||
|
|
||||||
bool USBHostKeyboard::connect() {
|
bool USBHostKeyboard::connect() {
|
||||||
|
|
||||||
if (dev_connected) {
|
if (dev_connected) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
||||||
if ((dev = host->getDevice(i)) != NULL) {
|
if ((dev = host->getDevice(i)) != NULL) {
|
||||||
|
|
||||||
if (host->enumerate(dev, this))
|
if (host->enumerate(dev, this))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (keyboard_device_found) {
|
if (keyboard_device_found) {
|
||||||
int_in = dev->getEndpoint(keyboard_intf, INTERRUPT_ENDPOINT, IN);
|
int_in = dev->getEndpoint(keyboard_intf, INTERRUPT_ENDPOINT, IN);
|
||||||
|
|
||||||
if (!int_in)
|
if (!int_in)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
USB_INFO("New Keyboard device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, keyboard_intf);
|
USB_INFO("New Keyboard device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, keyboard_intf);
|
||||||
dev->setName("Keyboard", keyboard_intf);
|
dev->setName("Keyboard", keyboard_intf);
|
||||||
host->registerDriver(dev, keyboard_intf, this, &USBHostKeyboard::init);
|
host->registerDriver(dev, keyboard_intf, this, &USBHostKeyboard::init);
|
||||||
|
|
||||||
int_in->attach(this, &USBHostKeyboard::rxHandler);
|
int_in->attach(this, &USBHostKeyboard::rxHandler);
|
||||||
host->interruptRead(dev, int_in, report, int_in->getSize(), false);
|
host->interruptRead(dev, int_in, report, int_in->getSize(), false);
|
||||||
|
|
||||||
dev_connected = true;
|
dev_connected = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,12 +23,12 @@
|
||||||
|
|
||||||
#include "USBHost.h"
|
#include "USBHost.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to communicate a USB keyboard
|
* A class to communicate a USB keyboard
|
||||||
*/
|
*/
|
||||||
class USBHostKeyboard : public IUSBEnumerator {
|
class USBHostKeyboard : public IUSBEnumerator {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -83,7 +83,7 @@ private:
|
||||||
uint8_t report[9];
|
uint8_t report[9];
|
||||||
int keyboard_intf;
|
int keyboard_intf;
|
||||||
bool keyboard_device_found;
|
bool keyboard_device_found;
|
||||||
|
|
||||||
bool dev_connected;
|
bool dev_connected;
|
||||||
|
|
||||||
void rxHandler();
|
void rxHandler();
|
||||||
|
@ -92,7 +92,7 @@ private:
|
||||||
void (*onKeyCode)(uint8_t key, uint8_t modifier);
|
void (*onKeyCode)(uint8_t key, uint8_t modifier);
|
||||||
|
|
||||||
int report_id;
|
int report_id;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,7 +35,7 @@ void USBHostMouse::init() {
|
||||||
dev_connected = false;
|
dev_connected = false;
|
||||||
mouse_device_found = false;
|
mouse_device_found = false;
|
||||||
mouse_intf = -1;
|
mouse_intf = -1;
|
||||||
|
|
||||||
buttons = 0;
|
buttons = 0;
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
|
@ -51,26 +51,26 @@ bool USBHostMouse::connect() {
|
||||||
if (dev_connected) {
|
if (dev_connected) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
||||||
if ((dev = host->getDevice(i)) != NULL) {
|
if ((dev = host->getDevice(i)) != NULL) {
|
||||||
|
|
||||||
if(host->enumerate(dev, this))
|
if(host->enumerate(dev, this))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (mouse_device_found) {
|
if (mouse_device_found) {
|
||||||
|
|
||||||
int_in = dev->getEndpoint(mouse_intf, INTERRUPT_ENDPOINT, IN);
|
int_in = dev->getEndpoint(mouse_intf, INTERRUPT_ENDPOINT, IN);
|
||||||
if (!int_in)
|
if (!int_in)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
USB_INFO("New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, mouse_intf);
|
USB_INFO("New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, mouse_intf);
|
||||||
dev->setName("Mouse", mouse_intf);
|
dev->setName("Mouse", mouse_intf);
|
||||||
host->registerDriver(dev, mouse_intf, this, &USBHostMouse::init);
|
host->registerDriver(dev, mouse_intf, this, &USBHostMouse::init);
|
||||||
|
|
||||||
int_in->attach(this, &USBHostMouse::rxHandler);
|
int_in->attach(this, &USBHostMouse::rxHandler);
|
||||||
host->interruptRead(dev, int_in, report, int_in->getSize(), false);
|
host->interruptRead(dev, int_in, report, int_in->getSize(), false);
|
||||||
|
|
||||||
dev_connected = true;
|
dev_connected = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -82,33 +82,33 @@ bool USBHostMouse::connect() {
|
||||||
|
|
||||||
void USBHostMouse::rxHandler() {
|
void USBHostMouse::rxHandler() {
|
||||||
int len_listen = int_in->getSize();
|
int len_listen = int_in->getSize();
|
||||||
|
|
||||||
if (onUpdate) {
|
if (onUpdate) {
|
||||||
(*onUpdate)(report[0] & 0x07, report[1], report[2], report[3]);
|
(*onUpdate)(report[0] & 0x07, report[1], report[2], report[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onButtonUpdate && (buttons != (report[0] & 0x07))) {
|
if (onButtonUpdate && (buttons != (report[0] & 0x07))) {
|
||||||
(*onButtonUpdate)(report[0] & 0x07);
|
(*onButtonUpdate)(report[0] & 0x07);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onXUpdate && (x != report[1])) {
|
if (onXUpdate && (x != report[1])) {
|
||||||
(*onXUpdate)(report[1]);
|
(*onXUpdate)(report[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onYUpdate && (y != report[2])) {
|
if (onYUpdate && (y != report[2])) {
|
||||||
(*onYUpdate)(report[2]);
|
(*onYUpdate)(report[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onZUpdate && (z != report[3])) {
|
if (onZUpdate && (z != report[3])) {
|
||||||
(*onZUpdate)(report[3]);
|
(*onZUpdate)(report[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update mouse state
|
// update mouse state
|
||||||
buttons = report[0] & 0x07;
|
buttons = report[0] & 0x07;
|
||||||
x = report[1];
|
x = report[1];
|
||||||
y = report[2];
|
y = report[2];
|
||||||
z = report[3];
|
z = report[3];
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
host->interruptRead(dev, int_in, report, len_listen, false);
|
host->interruptRead(dev, int_in, report, len_listen, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#include "USBHost.h"
|
#include "USBHost.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to communicate a USB mouse
|
* A class to communicate a USB mouse
|
||||||
*/
|
*/
|
||||||
class USBHostMouse : public IUSBEnumerator {
|
class USBHostMouse : public IUSBEnumerator {
|
||||||
|
@ -58,7 +58,7 @@ public:
|
||||||
onUpdate = ptr;
|
onUpdate = ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach a callback called when the button state changes
|
* Attach a callback called when the button state changes
|
||||||
*
|
*
|
||||||
|
@ -69,7 +69,7 @@ public:
|
||||||
onButtonUpdate = ptr;
|
onButtonUpdate = ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach a callback called when the X axis value changes
|
* Attach a callback called when the X axis value changes
|
||||||
*
|
*
|
||||||
|
@ -80,7 +80,7 @@ public:
|
||||||
onXUpdate = ptr;
|
onXUpdate = ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach a callback called when the Y axis value changes
|
* Attach a callback called when the Y axis value changes
|
||||||
*
|
*
|
||||||
|
@ -91,7 +91,7 @@ public:
|
||||||
onYUpdate = ptr;
|
onYUpdate = ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach a callback called when the Z axis value changes (scrolling)
|
* Attach a callback called when the Z axis value changes (scrolling)
|
||||||
*
|
*
|
||||||
|
@ -114,7 +114,7 @@ private:
|
||||||
USBDeviceConnected * dev;
|
USBDeviceConnected * dev;
|
||||||
USBEndpoint * int_in;
|
USBEndpoint * int_in;
|
||||||
uint8_t report[4];
|
uint8_t report[4];
|
||||||
|
|
||||||
bool dev_connected;
|
bool dev_connected;
|
||||||
bool mouse_device_found;
|
bool mouse_device_found;
|
||||||
int mouse_intf;
|
int mouse_intf;
|
||||||
|
|
|
@ -64,7 +64,7 @@ void USBHostHub::init() {
|
||||||
hub_device_found = false;
|
hub_device_found = false;
|
||||||
nb_port = 0;
|
nb_port = 0;
|
||||||
hub_characteristics = 0;
|
hub_characteristics = 0;
|
||||||
|
|
||||||
for (int i = 0; i < MAX_HUB_PORT; i++) {
|
for (int i = 0; i < MAX_HUB_PORT; i++) {
|
||||||
device_children[i] = NULL;
|
device_children[i] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -80,52 +80,52 @@ bool USBHostHub::connected()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool USBHostHub::connect(USBDeviceConnected * dev)
|
bool USBHostHub::connect(USBDeviceConnected * dev)
|
||||||
{
|
{
|
||||||
if (dev_connected) {
|
if (dev_connected) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(host->enumerate(dev, this)) {
|
if(host->enumerate(dev, this)) {
|
||||||
init();
|
init();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hub_device_found) {
|
if (hub_device_found) {
|
||||||
this->dev = dev;
|
this->dev = dev;
|
||||||
|
|
||||||
int_in = dev->getEndpoint(hub_intf, INTERRUPT_ENDPOINT, IN);
|
int_in = dev->getEndpoint(hub_intf, INTERRUPT_ENDPOINT, IN);
|
||||||
|
|
||||||
if (!int_in) {
|
if (!int_in) {
|
||||||
init();
|
init();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_INFO("New HUB: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, hub_intf);
|
USB_INFO("New HUB: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, hub_intf);
|
||||||
dev->setName("Hub", hub_intf);
|
dev->setName("Hub", hub_intf);
|
||||||
host->registerDriver(dev, hub_intf, this, &USBHostHub::disconnect);
|
host->registerDriver(dev, hub_intf, this, &USBHostHub::disconnect);
|
||||||
|
|
||||||
int_in->attach(this, &USBHostHub::rxHandler);
|
int_in->attach(this, &USBHostHub::rxHandler);
|
||||||
|
|
||||||
// get HUB descriptor
|
// get HUB descriptor
|
||||||
host->controlRead( dev,
|
host->controlRead( dev,
|
||||||
USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS,
|
USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS,
|
||||||
GET_DESCRIPTOR,
|
GET_DESCRIPTOR,
|
||||||
0x29 << 8, 0, buf, sizeof(HubDescriptor));
|
0x29 << 8, 0, buf, sizeof(HubDescriptor));
|
||||||
nb_port = buf[2];
|
nb_port = buf[2];
|
||||||
hub_characteristics = buf[3];
|
hub_characteristics = buf[3];
|
||||||
|
|
||||||
USB_DBG("Hub has %d port", nb_port);
|
USB_DBG("Hub has %d port", nb_port);
|
||||||
|
|
||||||
for (uint8_t j = 1; j <= nb_port; j++) {
|
for (uint8_t j = 1; j <= nb_port; j++) {
|
||||||
setPortFeature(PORT_POWER_FEATURE, j);
|
setPortFeature(PORT_POWER_FEATURE, j);
|
||||||
}
|
}
|
||||||
wait_ms(buf[5]*2);
|
wait_ms(buf[5]*2);
|
||||||
|
|
||||||
host->interruptRead(dev, int_in, buf, 1, false);
|
host->interruptRead(dev, int_in, buf, 1, false);
|
||||||
dev_connected = true;
|
dev_connected = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,7 +184,7 @@ void USBHostHub::rxHandler() {
|
||||||
for (int port = 1; port <= nb_port; port++) {
|
for (int port = 1; port <= nb_port; port++) {
|
||||||
status = getPortStatus(port);
|
status = getPortStatus(port);
|
||||||
USB_DBG("[hub handler hub: %d] status port %d [hub: %p]: 0x%X", dev->getHub(), port, dev, status);
|
USB_DBG("[hub handler hub: %d] status port %d [hub: %p]: 0x%X", dev->getHub(), port, dev, status);
|
||||||
|
|
||||||
// if connection status has changed
|
// if connection status has changed
|
||||||
if (status & C_PORT_CONNECTION) {
|
if (status & C_PORT_CONNECTION) {
|
||||||
if (status & PORT_CONNECTION) {
|
if (status & PORT_CONNECTION) {
|
||||||
|
@ -194,18 +194,18 @@ void USBHostHub::rxHandler() {
|
||||||
USB_DBG("[hub handler hub: %d - port: %d] device disconnected", dev->getHub(), port);
|
USB_DBG("[hub handler hub: %d - port: %d] device disconnected", dev->getHub(), port);
|
||||||
host->deviceDisconnected(dev->getHub() + 1, port, this, 0);
|
host->deviceDisconnected(dev->getHub() + 1, port, this, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
clearPortFeature(C_PORT_CONNECTION_FEATURE, port);
|
clearPortFeature(C_PORT_CONNECTION_FEATURE, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & C_PORT_RESET) {
|
if (status & C_PORT_RESET) {
|
||||||
clearPortFeature(C_PORT_RESET_FEATURE, port);
|
clearPortFeature(C_PORT_RESET_FEATURE, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & C_PORT_ENABLE) {
|
if (status & C_PORT_ENABLE) {
|
||||||
clearPortFeature(C_PORT_ENABLE_FEATURE, port);
|
clearPortFeature(C_PORT_ENABLE_FEATURE, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((status & PORT_OVER_CURRENT)) {
|
if ((status & PORT_OVER_CURRENT)) {
|
||||||
USB_ERR("OVER CURRENT DETECTED\r\n");
|
USB_ERR("OVER CURRENT DETECTED\r\n");
|
||||||
clearPortFeature(PORT_OVER_CURRENT, port);
|
clearPortFeature(PORT_OVER_CURRENT, port);
|
||||||
|
|
|
@ -28,7 +28,7 @@ class USBHost;
|
||||||
class USBDeviceConnected;
|
class USBDeviceConnected;
|
||||||
class USBEndpoint;
|
class USBEndpoint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to use a USB Hub
|
* A class to use a USB Hub
|
||||||
*/
|
*/
|
||||||
class USBHostHub : public IUSBEnumerator {
|
class USBHostHub : public IUSBEnumerator {
|
||||||
|
@ -52,7 +52,7 @@ public:
|
||||||
* @return true if connection was successful
|
* @return true if connection was successful
|
||||||
*/
|
*/
|
||||||
bool connect(USBDeviceConnected * dev);
|
bool connect(USBDeviceConnected * dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically called by USBHost when a device
|
* Automatically called by USBHost when a device
|
||||||
* has been enumerated by usb_thread
|
* has been enumerated by usb_thread
|
||||||
|
@ -60,7 +60,7 @@ public:
|
||||||
* @param dev device connected
|
* @param dev device connected
|
||||||
*/
|
*/
|
||||||
void deviceConnected(USBDeviceConnected * dev);
|
void deviceConnected(USBDeviceConnected * dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically called by USBHost when a device
|
* Automatically called by USBHost when a device
|
||||||
* has been disconnected from this hub
|
* has been disconnected from this hub
|
||||||
|
@ -68,21 +68,21 @@ public:
|
||||||
* @param dev device disconnected
|
* @param dev device disconnected
|
||||||
*/
|
*/
|
||||||
void deviceDisconnected(USBDeviceConnected * dev);
|
void deviceDisconnected(USBDeviceConnected * dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rest a specific port
|
* Rest a specific port
|
||||||
*
|
*
|
||||||
* @param port port number
|
* @param port port number
|
||||||
*/
|
*/
|
||||||
void portReset(uint8_t port);
|
void portReset(uint8_t port);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called by USBHost to set the instance of USBHost
|
* Called by USBHost to set the instance of USBHost
|
||||||
*
|
*
|
||||||
* @param host host instance
|
* @param host host instance
|
||||||
*/
|
*/
|
||||||
void setHost(USBHost * host);
|
void setHost(USBHost * host);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by USBhost when a hub has been disconnected
|
* Called by USBhost when a hub has been disconnected
|
||||||
*/
|
*/
|
||||||
|
@ -114,7 +114,7 @@ private:
|
||||||
uint32_t getPortStatus(uint8_t port);
|
uint32_t getPortStatus(uint8_t port);
|
||||||
|
|
||||||
USBDeviceConnected * device_children[MAX_HUB_PORT];
|
USBDeviceConnected * device_children[MAX_HUB_PORT];
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void disconnect();
|
void disconnect();
|
||||||
|
|
||||||
|
|
|
@ -65,19 +65,19 @@ bool USBHostMSD::connect()
|
||||||
|
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
|
||||||
if ((dev = host->getDevice(i)) != NULL) {
|
if ((dev = host->getDevice(i)) != NULL) {
|
||||||
|
|
||||||
USB_DBG("Trying to connect MSD device\r\n");
|
USB_DBG("Trying to connect MSD device\r\n");
|
||||||
|
|
||||||
if(host->enumerate(dev, this))
|
if(host->enumerate(dev, this))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (msd_device_found) {
|
if (msd_device_found) {
|
||||||
bulk_in = dev->getEndpoint(msd_intf, BULK_ENDPOINT, IN);
|
bulk_in = dev->getEndpoint(msd_intf, BULK_ENDPOINT, IN);
|
||||||
bulk_out = dev->getEndpoint(msd_intf, BULK_ENDPOINT, OUT);
|
bulk_out = dev->getEndpoint(msd_intf, BULK_ENDPOINT, OUT);
|
||||||
|
|
||||||
if (!bulk_in || !bulk_out)
|
if (!bulk_in || !bulk_out)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
USB_INFO("New MSD device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, msd_intf);
|
USB_INFO("New MSD device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, msd_intf);
|
||||||
dev->setName("MSD", msd_intf);
|
dev->setName("MSD", msd_intf);
|
||||||
host->registerDriver(dev, msd_intf, this, &USBHostMSD::init);
|
host->registerDriver(dev, msd_intf, this, &USBHostMSD::init);
|
||||||
|
@ -219,7 +219,7 @@ int USBHostMSD::SCSITransfer(uint8_t * cmd, uint8_t cmd_len, int flags, uint8_t
|
||||||
if (data) {
|
if (data) {
|
||||||
USB_DBG("data stage");
|
USB_DBG("data stage");
|
||||||
if (flags == HOST_TO_DEVICE) {
|
if (flags == HOST_TO_DEVICE) {
|
||||||
|
|
||||||
res = host->bulkWrite(dev, bulk_out, data, transfer_len);
|
res = host->bulkWrite(dev, bulk_out, data, transfer_len);
|
||||||
if (checkResult(res, bulk_out))
|
if (checkResult(res, bulk_out))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -242,7 +242,7 @@ int USBHostMSD::SCSITransfer(uint8_t * cmd, uint8_t cmd_len, int flags, uint8_t
|
||||||
if (csw.Signature != CSW_SIGNATURE) {
|
if (csw.Signature != CSW_SIGNATURE) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
USB_DBG("recv csw: status: %d", csw.Status);
|
USB_DBG("recv csw: status: %d", csw.Status);
|
||||||
|
|
||||||
// ModeSense?
|
// ModeSense?
|
||||||
|
@ -250,27 +250,27 @@ int USBHostMSD::SCSITransfer(uint8_t * cmd, uint8_t cmd_len, int flags, uint8_t
|
||||||
USB_DBG("request mode sense");
|
USB_DBG("request mode sense");
|
||||||
return SCSIRequestSense();
|
return SCSIRequestSense();
|
||||||
}
|
}
|
||||||
|
|
||||||
// perform reset recovery
|
// perform reset recovery
|
||||||
if ((csw.Status == 2) && (cmd[0] != 0x03)) {
|
if ((csw.Status == 2) && (cmd[0] != 0x03)) {
|
||||||
|
|
||||||
// send Bulk-Only Mass Storage Reset request
|
// send Bulk-Only Mass Storage Reset request
|
||||||
res = host->controlWrite( dev,
|
res = host->controlWrite( dev,
|
||||||
USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
|
USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
|
||||||
BO_MASS_STORAGE_RESET,
|
BO_MASS_STORAGE_RESET,
|
||||||
0, msd_intf, NULL, 0);
|
0, msd_intf, NULL, 0);
|
||||||
|
|
||||||
// unstall both endpoints
|
// unstall both endpoints
|
||||||
res = host->controlWrite( dev,
|
res = host->controlWrite( dev,
|
||||||
USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
|
USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
|
||||||
CLEAR_FEATURE,
|
CLEAR_FEATURE,
|
||||||
0, bulk_in->getAddress(), NULL, 0);
|
0, bulk_in->getAddress(), NULL, 0);
|
||||||
|
|
||||||
res = host->controlWrite( dev,
|
res = host->controlWrite( dev,
|
||||||
USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
|
USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
|
||||||
CLEAR_FEATURE,
|
CLEAR_FEATURE,
|
||||||
0, bulk_out->getAddress(), NULL, 0);
|
0, bulk_out->getAddress(), NULL, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return csw.Status;
|
return csw.Status;
|
||||||
|
@ -304,20 +304,20 @@ int USBHostMSD::getMaxLun() {
|
||||||
int USBHostMSD::disk_initialize() {
|
int USBHostMSD::disk_initialize() {
|
||||||
USB_DBG("FILESYSTEM: init");
|
USB_DBG("FILESYSTEM: init");
|
||||||
U16 i, timeout = 10;
|
U16 i, timeout = 10;
|
||||||
|
|
||||||
getMaxLun();
|
getMaxLun();
|
||||||
|
|
||||||
for (i = 0; i < timeout; i++) {
|
for (i = 0; i < timeout; i++) {
|
||||||
Thread::wait(100);
|
Thread::wait(100);
|
||||||
if (!testUnitReady())
|
if (!testUnitReady())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == timeout) {
|
if (i == timeout) {
|
||||||
disk_init = false;
|
disk_init = false;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inquiry(0, 0);
|
inquiry(0, 0);
|
||||||
disk_init = 1;
|
disk_init = 1;
|
||||||
return readCapacity();
|
return readCapacity();
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "USBHost.h"
|
#include "USBHost.h"
|
||||||
#include "FATFileSystem.h"
|
#include "FATFileSystem.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to communicate a USB flash disk
|
* A class to communicate a USB flash disk
|
||||||
*/
|
*/
|
||||||
class USBHostMSD : public IUSBEnumerator, public FATFileSystem {
|
class USBHostMSD : public IUSBEnumerator, public FATFileSystem {
|
||||||
|
@ -109,7 +109,7 @@ private:
|
||||||
int msd_intf;
|
int msd_intf;
|
||||||
bool msd_device_found;
|
bool msd_device_found;
|
||||||
bool disk_init;
|
bool disk_init;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
template<typename T, int size>
|
template<typename T, int size>
|
||||||
class MtxCircBuffer {
|
class MtxCircBuffer {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MtxCircBuffer() {
|
MtxCircBuffer() {
|
||||||
write = 0;
|
write = 0;
|
||||||
read = 0;
|
read = 0;
|
||||||
|
@ -43,7 +43,7 @@ public:
|
||||||
mtx.unlock();
|
mtx.unlock();
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush() {
|
void flush() {
|
||||||
write = 0;
|
write = 0;
|
||||||
read = 0;
|
read = 0;
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
#if (USBHOST_SERIAL <= 1)
|
#if (USBHOST_SERIAL <= 1)
|
||||||
|
|
||||||
USBHostSerial::USBHostSerial()
|
USBHostSerial::USBHostSerial()
|
||||||
{
|
{
|
||||||
host = USBHost::getHostInst();
|
host = USBHost::getHostInst();
|
||||||
ports_found = 0;
|
ports_found = 0;
|
||||||
|
@ -46,9 +46,9 @@ void USBHostSerial::disconnect(void)
|
||||||
|
|
||||||
bool USBHostSerial::connect() {
|
bool USBHostSerial::connect() {
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
{
|
{
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
||||||
{
|
{
|
||||||
USBDeviceConnected* d = host->getDevice(i);
|
USBDeviceConnected* d = host->getDevice(i);
|
||||||
if (dev == d)
|
if (dev == d)
|
||||||
|
@ -56,15 +56,15 @@ bool USBHostSerial::connect() {
|
||||||
}
|
}
|
||||||
disconnect();
|
disconnect();
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
||||||
{
|
{
|
||||||
USBDeviceConnected* d = host->getDevice(i);
|
USBDeviceConnected* d = host->getDevice(i);
|
||||||
if (d != NULL) {
|
if (d != NULL) {
|
||||||
|
|
||||||
USB_DBG("Trying to connect serial device \r\n");
|
USB_DBG("Trying to connect serial device \r\n");
|
||||||
if(host->enumerate(d, this))
|
if(host->enumerate(d, this))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
USBEndpoint* bulk_in = d->getEndpoint(port_intf, BULK_ENDPOINT, IN);
|
USBEndpoint* bulk_in = d->getEndpoint(port_intf, BULK_ENDPOINT, IN);
|
||||||
USBEndpoint* bulk_out = d->getEndpoint(port_intf, BULK_ENDPOINT, OUT);
|
USBEndpoint* bulk_out = d->getEndpoint(port_intf, BULK_ENDPOINT, OUT);
|
||||||
if (bulk_in && bulk_out)
|
if (bulk_in && bulk_out)
|
||||||
|
@ -84,7 +84,7 @@ bool USBHostSerial::connect() {
|
||||||
|
|
||||||
/*virtual*/ bool USBHostSerial::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
|
/*virtual*/ bool USBHostSerial::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
|
||||||
{
|
{
|
||||||
if (!ports_found &&
|
if (!ports_found &&
|
||||||
CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
|
CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
|
||||||
port_intf = intf_nb;
|
port_intf = intf_nb;
|
||||||
ports_found = true;
|
ports_found = true;
|
||||||
|
@ -96,7 +96,7 @@ bool USBHostSerial::connect() {
|
||||||
/*virtual*/ bool USBHostSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
|
/*virtual*/ bool USBHostSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
|
||||||
{
|
{
|
||||||
if (ports_found && (intf_nb == port_intf)) {
|
if (ports_found && (intf_nb == port_intf)) {
|
||||||
if (type == BULK_ENDPOINT)
|
if (type == BULK_ENDPOINT)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -106,7 +106,7 @@ bool USBHostSerial::connect() {
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
USBHostMultiSerial::USBHostMultiSerial()
|
USBHostMultiSerial::USBHostMultiSerial()
|
||||||
{
|
{
|
||||||
host = USBHost::getHostInst();
|
host = USBHost::getHostInst();
|
||||||
dev = NULL;
|
dev = NULL;
|
||||||
|
@ -127,7 +127,7 @@ bool USBHostMultiSerial::connected()
|
||||||
|
|
||||||
void USBHostMultiSerial::disconnect(void)
|
void USBHostMultiSerial::disconnect(void)
|
||||||
{
|
{
|
||||||
for (int port = 0; port < USBHOST_SERIAL; port ++)
|
for (int port = 0; port < USBHOST_SERIAL; port ++)
|
||||||
{
|
{
|
||||||
if (ports[port])
|
if (ports[port])
|
||||||
{
|
{
|
||||||
|
@ -141,9 +141,9 @@ void USBHostMultiSerial::disconnect(void)
|
||||||
|
|
||||||
bool USBHostMultiSerial::connect() {
|
bool USBHostMultiSerial::connect() {
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
{
|
{
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
||||||
{
|
{
|
||||||
USBDeviceConnected* d = host->getDevice(i);
|
USBDeviceConnected* d = host->getDevice(i);
|
||||||
if (dev == d)
|
if (dev == d)
|
||||||
|
@ -151,16 +151,16 @@ bool USBHostMultiSerial::connect() {
|
||||||
}
|
}
|
||||||
disconnect();
|
disconnect();
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
|
||||||
{
|
{
|
||||||
USBDeviceConnected* d = host->getDevice(i);
|
USBDeviceConnected* d = host->getDevice(i);
|
||||||
if (d != NULL) {
|
if (d != NULL) {
|
||||||
|
|
||||||
USB_DBG("Trying to connect serial device \r\n");
|
USB_DBG("Trying to connect serial device \r\n");
|
||||||
if(host->enumerate(d, this))
|
if(host->enumerate(d, this))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
for (int port = 0; port < ports_found; port ++)
|
for (int port = 0; port < ports_found; port ++)
|
||||||
{
|
{
|
||||||
USBEndpoint* bulk_in = d->getEndpoint(port_intf[port], BULK_ENDPOINT, IN);
|
USBEndpoint* bulk_in = d->getEndpoint(port_intf[port], BULK_ENDPOINT, IN);
|
||||||
USBEndpoint* bulk_out = d->getEndpoint(port_intf[port], BULK_ENDPOINT, OUT);
|
USBEndpoint* bulk_out = d->getEndpoint(port_intf[port], BULK_ENDPOINT, OUT);
|
||||||
|
@ -186,7 +186,7 @@ bool USBHostMultiSerial::connect() {
|
||||||
|
|
||||||
/*virtual*/ bool USBHostMultiSerial::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
|
/*virtual*/ bool USBHostMultiSerial::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
|
||||||
{
|
{
|
||||||
if ((ports_found < USBHOST_SERIAL) &&
|
if ((ports_found < USBHOST_SERIAL) &&
|
||||||
CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
|
CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
|
||||||
port_intf[ports_found++] = intf_nb;
|
port_intf[ports_found++] = intf_nb;
|
||||||
return true;
|
return true;
|
||||||
|
@ -197,7 +197,7 @@ bool USBHostMultiSerial::connect() {
|
||||||
/*virtual*/ bool USBHostMultiSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
|
/*virtual*/ bool USBHostMultiSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
|
||||||
{
|
{
|
||||||
if ((ports_found > 0) && (intf_nb == port_intf[ports_found-1])) {
|
if ((ports_found > 0) && (intf_nb == port_intf[ports_found-1])) {
|
||||||
if (type == BULK_ENDPOINT)
|
if (type == BULK_ENDPOINT)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -209,7 +209,7 @@ bool USBHostMultiSerial::connect() {
|
||||||
|
|
||||||
#define SET_LINE_CODING 0x20
|
#define SET_LINE_CODING 0x20
|
||||||
|
|
||||||
USBHostSerialPort::USBHostSerialPort(): circ_buf()
|
USBHostSerialPort::USBHostSerialPort(): circ_buf()
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,7 @@ void USBHostSerialPort::init(void)
|
||||||
circ_buf.flush();
|
circ_buf.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void USBHostSerialPort::connect(USBHost* _host, USBDeviceConnected * _dev,
|
void USBHostSerialPort::connect(USBHost* _host, USBDeviceConnected * _dev,
|
||||||
uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out)
|
uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out)
|
||||||
{
|
{
|
||||||
host = _host;
|
host = _host;
|
||||||
|
@ -238,7 +238,7 @@ void USBHostSerialPort::connect(USBHost* _host, USBDeviceConnected * _dev,
|
||||||
serial_intf = _serial_intf;
|
serial_intf = _serial_intf;
|
||||||
bulk_in = _bulk_in;
|
bulk_in = _bulk_in;
|
||||||
bulk_out = _bulk_out;
|
bulk_out = _bulk_out;
|
||||||
|
|
||||||
USB_INFO("New Serial device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, serial_intf);
|
USB_INFO("New Serial device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, serial_intf);
|
||||||
dev->setName("Serial", serial_intf);
|
dev->setName("Serial", serial_intf);
|
||||||
host->registerDriver(dev, serial_intf, this, &USBHostSerialPort::init);
|
host->registerDriver(dev, serial_intf, this, &USBHostSerialPort::init);
|
||||||
|
@ -289,7 +289,7 @@ void USBHostSerialPort::format(int bits, Parity parity, int stop_bits) {
|
||||||
line_coding.data_bits = bits;
|
line_coding.data_bits = bits;
|
||||||
line_coding.parity = parity;
|
line_coding.parity = parity;
|
||||||
line_coding.stop_bits = (stop_bits == 1) ? 0 : 2;
|
line_coding.stop_bits = (stop_bits == 1) ? 0 : 2;
|
||||||
|
|
||||||
// set line coding
|
// set line coding
|
||||||
host->controlWrite( dev,
|
host->controlWrite( dev,
|
||||||
USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
|
USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
|
||||||
|
@ -311,12 +311,12 @@ int USBHostSerialPort::_getc() {
|
||||||
int USBHostSerialPort::writeBuf(const char* b, int s)
|
int USBHostSerialPort::writeBuf(const char* b, int s)
|
||||||
{
|
{
|
||||||
int c = 0;
|
int c = 0;
|
||||||
if (bulk_out)
|
if (bulk_out)
|
||||||
{
|
{
|
||||||
while (c < s)
|
while (c < s)
|
||||||
{
|
{
|
||||||
int i = (s < size_bulk_out) ? s : size_bulk_out;
|
int i = (s < size_bulk_out) ? s : size_bulk_out;
|
||||||
if (host->bulkWrite(dev, bulk_out, (uint8_t *)(b+c), i) == USB_TYPE_OK)
|
if (host->bulkWrite(dev, bulk_out, (uint8_t *)(b+c), i) == USB_TYPE_OK)
|
||||||
c += i;
|
c += i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,7 +326,7 @@ int USBHostSerialPort::writeBuf(const char* b, int s)
|
||||||
int USBHostSerialPort::readBuf(char* b, int s)
|
int USBHostSerialPort::readBuf(char* b, int s)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (bulk_in)
|
if (bulk_in)
|
||||||
{
|
{
|
||||||
for (i = 0; i < s; )
|
for (i = 0; i < s; )
|
||||||
b[i++] = getc();
|
b[i++] = getc();
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "MtxCircBuffer.h"
|
#include "MtxCircBuffer.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to communicate a USB virtual serial port
|
* A class to communicate a USB virtual serial port
|
||||||
*/
|
*/
|
||||||
class USBHostSerialPort : public Stream {
|
class USBHostSerialPort : public Stream {
|
||||||
|
@ -39,7 +39,7 @@ public:
|
||||||
RxIrq,
|
RxIrq,
|
||||||
TxIrq
|
TxIrq
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Parity {
|
enum Parity {
|
||||||
None = 0,
|
None = 0,
|
||||||
Odd,
|
Odd,
|
||||||
|
@ -48,7 +48,7 @@ public:
|
||||||
Space
|
Space
|
||||||
};
|
};
|
||||||
|
|
||||||
void connect(USBHost* _host, USBDeviceConnected * _dev,
|
void connect(USBHost* _host, USBDeviceConnected * _dev,
|
||||||
uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
|
uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,7 +56,7 @@ public:
|
||||||
*
|
*
|
||||||
* @returns the number of bytes available
|
* @returns the number of bytes available
|
||||||
*/
|
*/
|
||||||
uint8_t available();
|
uint8_t available();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach a member function to call when a packet is received.
|
* Attach a member function to call when a packet is received.
|
||||||
|
@ -90,13 +90,13 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set the baud rate of the serial port
|
/** Set the baud rate of the serial port
|
||||||
*
|
*
|
||||||
* @param baudrate The baudrate of the serial port (default = 9600).
|
* @param baudrate The baudrate of the serial port (default = 9600).
|
||||||
*/
|
*/
|
||||||
void baud(int baudrate = 9600);
|
void baud(int baudrate = 9600);
|
||||||
|
|
||||||
/** Set the transmission format used by the Serial port
|
/** Set the transmission format used by the Serial port
|
||||||
*
|
*
|
||||||
* @param bits The number of bits in a word (default = 8)
|
* @param bits The number of bits in a word (default = 8)
|
||||||
|
@ -110,7 +110,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
virtual int _getc();
|
virtual int _getc();
|
||||||
virtual int _putc(int c);
|
virtual int _putc(int c);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
USBHost * host;
|
USBHost * host;
|
||||||
USBDeviceConnected * dev;
|
USBDeviceConnected * dev;
|
||||||
|
@ -132,7 +132,7 @@ private:
|
||||||
uint8_t parity;
|
uint8_t parity;
|
||||||
uint8_t data_bits;
|
uint8_t data_bits;
|
||||||
} PACKED LINE_CODING;
|
} PACKED LINE_CODING;
|
||||||
|
|
||||||
LINE_CODING line_coding;
|
LINE_CODING line_coding;
|
||||||
|
|
||||||
void rxHandler();
|
void rxHandler();
|
||||||
|
@ -145,18 +145,18 @@ private:
|
||||||
|
|
||||||
#if (USBHOST_SERIAL <= 1)
|
#if (USBHOST_SERIAL <= 1)
|
||||||
|
|
||||||
class USBHostSerial : public IUSBEnumerator, public USBHostSerialPort
|
class USBHostSerial : public IUSBEnumerator, public USBHostSerialPort
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
USBHostSerial();
|
USBHostSerial();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to connect a serial device
|
* Try to connect a serial device
|
||||||
*
|
*
|
||||||
* @return true if connection was successful
|
* @return true if connection was successful
|
||||||
*/
|
*/
|
||||||
bool connect();
|
bool connect();
|
||||||
|
|
||||||
void disconnect();
|
void disconnect();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -165,7 +165,7 @@ public:
|
||||||
* @returns true if a serial device is connected
|
* @returns true if a serial device is connected
|
||||||
*/
|
*/
|
||||||
bool connected();
|
bool connected();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
USBHost* host;
|
USBHost* host;
|
||||||
USBDeviceConnected* dev;
|
USBDeviceConnected* dev;
|
||||||
|
@ -176,7 +176,7 @@ protected:
|
||||||
virtual void setVidPid(uint16_t vid, uint16_t pid);
|
virtual void setVidPid(uint16_t vid, uint16_t pid);
|
||||||
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
|
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
|
||||||
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
|
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool dev_connected;
|
bool dev_connected;
|
||||||
};
|
};
|
||||||
|
@ -184,13 +184,13 @@ private:
|
||||||
#else // (USBHOST_SERIAL > 1)
|
#else // (USBHOST_SERIAL > 1)
|
||||||
|
|
||||||
class USBHostMultiSerial : public IUSBEnumerator {
|
class USBHostMultiSerial : public IUSBEnumerator {
|
||||||
public:
|
public:
|
||||||
USBHostMultiSerial();
|
USBHostMultiSerial();
|
||||||
virtual ~USBHostMultiSerial();
|
virtual ~USBHostMultiSerial();
|
||||||
|
|
||||||
USBHostSerialPort* getPort(int port)
|
USBHostSerialPort* getPort(int port)
|
||||||
{
|
{
|
||||||
return port < USBHOST_SERIAL ? ports[port] : NULL;
|
return port < USBHOST_SERIAL ? ports[port] : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -199,7 +199,7 @@ public:
|
||||||
* @return true if connection was successful
|
* @return true if connection was successful
|
||||||
*/
|
*/
|
||||||
bool connect();
|
bool connect();
|
||||||
|
|
||||||
void disconnect();
|
void disconnect();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -208,7 +208,7 @@ public:
|
||||||
* @returns true if a serial device is connected
|
* @returns true if a serial device is connected
|
||||||
*/
|
*/
|
||||||
bool connected();
|
bool connected();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
USBHost* host;
|
USBHost* host;
|
||||||
USBDeviceConnected* dev;
|
USBDeviceConnected* dev;
|
||||||
|
@ -220,7 +220,7 @@ protected:
|
||||||
virtual void setVidPid(uint16_t vid, uint16_t pid);
|
virtual void setVidPid(uint16_t vid, uint16_t pid);
|
||||||
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
|
virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
|
||||||
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
|
virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool dev_connected;
|
bool dev_connected;
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,7 +14,7 @@ using namespace mbed;
|
||||||
|
|
||||||
DSTATUS disk_initialize (
|
DSTATUS disk_initialize (
|
||||||
BYTE drv /* Physical drive nmuber (0..) */
|
BYTE drv /* Physical drive nmuber (0..) */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
debug_if(FFS_DBG, "disk_initialize on drv [%d]\n", drv);
|
debug_if(FFS_DBG, "disk_initialize on drv [%d]\n", drv);
|
||||||
return (DSTATUS)FATFileSystem::_ffs[drv]->disk_initialize();
|
return (DSTATUS)FATFileSystem::_ffs[drv]->disk_initialize();
|
||||||
|
@ -22,7 +22,7 @@ DSTATUS disk_initialize (
|
||||||
|
|
||||||
DSTATUS disk_status (
|
DSTATUS disk_status (
|
||||||
BYTE drv /* Physical drive nmuber (0..) */
|
BYTE drv /* Physical drive nmuber (0..) */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
debug_if(FFS_DBG, "disk_status on drv [%d]\n", drv);
|
debug_if(FFS_DBG, "disk_status on drv [%d]\n", drv);
|
||||||
return (DSTATUS)FATFileSystem::_ffs[drv]->disk_status();
|
return (DSTATUS)FATFileSystem::_ffs[drv]->disk_status();
|
||||||
|
|
|
@ -38,13 +38,13 @@ int FATFileHandle::close() {
|
||||||
ssize_t FATFileHandle::write(const void* buffer, size_t length) {
|
ssize_t FATFileHandle::write(const void* buffer, size_t length) {
|
||||||
UINT n;
|
UINT n;
|
||||||
FRESULT res = f_write(&_fh, buffer, length, &n);
|
FRESULT res = f_write(&_fh, buffer, length, &n);
|
||||||
if (res) {
|
if (res) {
|
||||||
debug_if(FFS_DBG, "f_write() failed: %d", res);
|
debug_if(FFS_DBG, "f_write() failed: %d", res);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t FATFileHandle::read(void* buffer, size_t length) {
|
ssize_t FATFileHandle::read(void* buffer, size_t length) {
|
||||||
debug_if(FFS_DBG, "read(%d)\n", length);
|
debug_if(FFS_DBG, "read(%d)\n", length);
|
||||||
UINT n;
|
UINT n;
|
||||||
|
|
|
@ -69,7 +69,7 @@ FileHandle *FATFileSystem::open(const char* name, int flags) {
|
||||||
debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid);
|
debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid);
|
||||||
char n[64];
|
char n[64];
|
||||||
sprintf(n, "%d:/%s", _fsid, name);
|
sprintf(n, "%d:/%s", _fsid, name);
|
||||||
|
|
||||||
/* POSIX flags -> FatFS open mode */
|
/* POSIX flags -> FatFS open mode */
|
||||||
BYTE openmode;
|
BYTE openmode;
|
||||||
if (flags & O_RDWR) {
|
if (flags & O_RDWR) {
|
||||||
|
@ -86,10 +86,10 @@ FileHandle *FATFileSystem::open(const char* name, int flags) {
|
||||||
openmode |= FA_OPEN_ALWAYS;
|
openmode |= FA_OPEN_ALWAYS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FIL fh;
|
FIL fh;
|
||||||
FRESULT res = f_open(&fh, n, openmode);
|
FRESULT res = f_open(&fh, n, openmode);
|
||||||
if (res) {
|
if (res) {
|
||||||
debug_if(FFS_DBG, "f_open('w') failed: %d\n", res);
|
debug_if(FFS_DBG, "f_open('w') failed: %d\n", res);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -98,10 +98,10 @@ FileHandle *FATFileSystem::open(const char* name, int flags) {
|
||||||
}
|
}
|
||||||
return new FATFileHandle(fh);
|
return new FATFileHandle(fh);
|
||||||
}
|
}
|
||||||
|
|
||||||
int FATFileSystem::remove(const char *filename) {
|
int FATFileSystem::remove(const char *filename) {
|
||||||
FRESULT res = f_unlink(filename);
|
FRESULT res = f_unlink(filename);
|
||||||
if (res) {
|
if (res) {
|
||||||
debug_if(FFS_DBG, "f_unlink() failed: %d\n", res);
|
debug_if(FFS_DBG, "f_unlink() failed: %d\n", res);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,13 +153,13 @@ int SDFileSystem::initialise_card() {
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
// send CMD0, should return with all zeros except IDLE STATE set (bit 0)
|
// send CMD0, should return with all zeros except IDLE STATE set (bit 0)
|
||||||
if (_cmd(0, 0) != R1_IDLE_STATE) {
|
if (_cmd(0, 0) != R1_IDLE_STATE) {
|
||||||
debug("No disk, or could not put SD card in to SPI idle state\n");
|
debug("No disk, or could not put SD card in to SPI idle state\n");
|
||||||
return SDCARD_FAIL;
|
return SDCARD_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// send CMD8 to determine whther it is ver 2.x
|
// send CMD8 to determine whther it is ver 2.x
|
||||||
int r = _cmd8();
|
int r = _cmd8();
|
||||||
if (r == R1_IDLE_STATE) {
|
if (r == R1_IDLE_STATE) {
|
||||||
|
@ -181,7 +181,7 @@ int SDFileSystem::initialise_card_v1() {
|
||||||
return SDCARD_V1;
|
return SDCARD_V1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("Timeout waiting for v1.x card\n");
|
debug("Timeout waiting for v1.x card\n");
|
||||||
return SDCARD_FAIL;
|
return SDCARD_FAIL;
|
||||||
}
|
}
|
||||||
|
@ -198,7 +198,7 @@ int SDFileSystem::initialise_card_v2() {
|
||||||
return SDCARD_V2;
|
return SDCARD_V2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("Timeout waiting for v2.x card\n");
|
debug("Timeout waiting for v2.x card\n");
|
||||||
return SDCARD_FAIL;
|
return SDCARD_FAIL;
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ int SDFileSystem::disk_initialize() {
|
||||||
}
|
}
|
||||||
debug_if(SD_DBG, "init card = %d\n", _is_initialized);
|
debug_if(SD_DBG, "init card = %d\n", _is_initialized);
|
||||||
_sectors = _sd_sectors();
|
_sectors = _sd_sectors();
|
||||||
|
|
||||||
// Set block length to 512 (CMD16)
|
// Set block length to 512 (CMD16)
|
||||||
if (_cmd(16, 512) != 0) {
|
if (_cmd(16, 512) != 0) {
|
||||||
debug("Set 512-byte block timed out\n");
|
debug("Set 512-byte block timed out\n");
|
||||||
|
@ -232,7 +232,7 @@ int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) {
|
||||||
if (_cmd(24, block_number * cdv) != 0) {
|
if (_cmd(24, block_number * cdv) != 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// send the data block
|
// send the data block
|
||||||
_write(buffer, 512);
|
_write(buffer, 512);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -247,7 +247,7 @@ int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) {
|
||||||
if (_cmd(17, block_number * cdv) != 0) {
|
if (_cmd(17, block_number * cdv) != 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// receive the data
|
// receive the data
|
||||||
_read(buffer, 512);
|
_read(buffer, 512);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -269,7 +269,7 @@ uint64_t SDFileSystem::disk_sectors() { return _sectors; }
|
||||||
// PRIVATE FUNCTIONS
|
// PRIVATE FUNCTIONS
|
||||||
int SDFileSystem::_cmd(int cmd, int arg) {
|
int SDFileSystem::_cmd(int cmd, int arg) {
|
||||||
_cs = 0;
|
_cs = 0;
|
||||||
|
|
||||||
// send a command
|
// send a command
|
||||||
_spi.write(0x40 | cmd);
|
_spi.write(0x40 | cmd);
|
||||||
_spi.write(arg >> 24);
|
_spi.write(arg >> 24);
|
||||||
|
@ -277,7 +277,7 @@ int SDFileSystem::_cmd(int cmd, int arg) {
|
||||||
_spi.write(arg >> 8);
|
_spi.write(arg >> 8);
|
||||||
_spi.write(arg >> 0);
|
_spi.write(arg >> 0);
|
||||||
_spi.write(0x95);
|
_spi.write(0x95);
|
||||||
|
|
||||||
// wait for the repsonse (response[7] == 0)
|
// wait for the repsonse (response[7] == 0)
|
||||||
for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
|
for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
|
||||||
int response = _spi.write(0xFF);
|
int response = _spi.write(0xFF);
|
||||||
|
@ -293,7 +293,7 @@ int SDFileSystem::_cmd(int cmd, int arg) {
|
||||||
}
|
}
|
||||||
int SDFileSystem::_cmdx(int cmd, int arg) {
|
int SDFileSystem::_cmdx(int cmd, int arg) {
|
||||||
_cs = 0;
|
_cs = 0;
|
||||||
|
|
||||||
// send a command
|
// send a command
|
||||||
_spi.write(0x40 | cmd);
|
_spi.write(0x40 | cmd);
|
||||||
_spi.write(arg >> 24);
|
_spi.write(arg >> 24);
|
||||||
|
@ -301,7 +301,7 @@ int SDFileSystem::_cmdx(int cmd, int arg) {
|
||||||
_spi.write(arg >> 8);
|
_spi.write(arg >> 8);
|
||||||
_spi.write(arg >> 0);
|
_spi.write(arg >> 0);
|
||||||
_spi.write(0x95);
|
_spi.write(0x95);
|
||||||
|
|
||||||
// wait for the repsonse (response[7] == 0)
|
// wait for the repsonse (response[7] == 0)
|
||||||
for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
|
for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
|
||||||
int response = _spi.write(0xFF);
|
int response = _spi.write(0xFF);
|
||||||
|
@ -318,7 +318,7 @@ int SDFileSystem::_cmdx(int cmd, int arg) {
|
||||||
int SDFileSystem::_cmd58() {
|
int SDFileSystem::_cmd58() {
|
||||||
_cs = 0;
|
_cs = 0;
|
||||||
int arg = 0;
|
int arg = 0;
|
||||||
|
|
||||||
// send a command
|
// send a command
|
||||||
_spi.write(0x40 | 58);
|
_spi.write(0x40 | 58);
|
||||||
_spi.write(arg >> 24);
|
_spi.write(arg >> 24);
|
||||||
|
@ -326,7 +326,7 @@ int SDFileSystem::_cmd58() {
|
||||||
_spi.write(arg >> 8);
|
_spi.write(arg >> 8);
|
||||||
_spi.write(arg >> 0);
|
_spi.write(arg >> 0);
|
||||||
_spi.write(0x95);
|
_spi.write(0x95);
|
||||||
|
|
||||||
// wait for the repsonse (response[7] == 0)
|
// wait for the repsonse (response[7] == 0)
|
||||||
for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
|
for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) {
|
||||||
int response = _spi.write(0xFF);
|
int response = _spi.write(0xFF);
|
||||||
|
@ -347,7 +347,7 @@ int SDFileSystem::_cmd58() {
|
||||||
|
|
||||||
int SDFileSystem::_cmd8() {
|
int SDFileSystem::_cmd8() {
|
||||||
_cs = 0;
|
_cs = 0;
|
||||||
|
|
||||||
// send a command
|
// send a command
|
||||||
_spi.write(0x40 | 8); // CMD8
|
_spi.write(0x40 | 8); // CMD8
|
||||||
_spi.write(0x00); // reserved
|
_spi.write(0x00); // reserved
|
||||||
|
@ -355,7 +355,7 @@ int SDFileSystem::_cmd8() {
|
||||||
_spi.write(0x01); // 3.3v
|
_spi.write(0x01); // 3.3v
|
||||||
_spi.write(0xAA); // check pattern
|
_spi.write(0xAA); // check pattern
|
||||||
_spi.write(0x87); // crc
|
_spi.write(0x87); // crc
|
||||||
|
|
||||||
// wait for the repsonse (response[7] == 0)
|
// wait for the repsonse (response[7] == 0)
|
||||||
for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) {
|
for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) {
|
||||||
char response[5];
|
char response[5];
|
||||||
|
@ -376,17 +376,17 @@ int SDFileSystem::_cmd8() {
|
||||||
|
|
||||||
int SDFileSystem::_read(uint8_t *buffer, uint32_t length) {
|
int SDFileSystem::_read(uint8_t *buffer, uint32_t length) {
|
||||||
_cs = 0;
|
_cs = 0;
|
||||||
|
|
||||||
// read until start byte (0xFF)
|
// read until start byte (0xFF)
|
||||||
while (_spi.write(0xFF) != 0xFE);
|
while (_spi.write(0xFF) != 0xFE);
|
||||||
|
|
||||||
// read data
|
// read data
|
||||||
for (uint32_t i = 0; i < length; i++) {
|
for (uint32_t i = 0; i < length; i++) {
|
||||||
buffer[i] = _spi.write(0xFF);
|
buffer[i] = _spi.write(0xFF);
|
||||||
}
|
}
|
||||||
_spi.write(0xFF); // checksum
|
_spi.write(0xFF); // checksum
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
|
|
||||||
_cs = 1;
|
_cs = 1;
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -394,29 +394,29 @@ int SDFileSystem::_read(uint8_t *buffer, uint32_t length) {
|
||||||
|
|
||||||
int SDFileSystem::_write(const uint8_t*buffer, uint32_t length) {
|
int SDFileSystem::_write(const uint8_t*buffer, uint32_t length) {
|
||||||
_cs = 0;
|
_cs = 0;
|
||||||
|
|
||||||
// indicate start of block
|
// indicate start of block
|
||||||
_spi.write(0xFE);
|
_spi.write(0xFE);
|
||||||
|
|
||||||
// write the data
|
// write the data
|
||||||
for (uint32_t i = 0; i < length; i++) {
|
for (uint32_t i = 0; i < length; i++) {
|
||||||
_spi.write(buffer[i]);
|
_spi.write(buffer[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write the checksum
|
// write the checksum
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
|
|
||||||
// check the response token
|
// check the response token
|
||||||
if ((_spi.write(0xFF) & 0x1F) != 0x05) {
|
if ((_spi.write(0xFF) & 0x1F) != 0x05) {
|
||||||
_cs = 1;
|
_cs = 1;
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait for write to finish
|
// wait for write to finish
|
||||||
while (_spi.write(0xFF) == 0);
|
while (_spi.write(0xFF) == 0);
|
||||||
|
|
||||||
_cs = 1;
|
_cs = 1;
|
||||||
_spi.write(0xFF);
|
_spi.write(0xFF);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -440,33 +440,33 @@ uint64_t SDFileSystem::_sd_sectors() {
|
||||||
uint32_t block_len, mult, blocknr, capacity;
|
uint32_t block_len, mult, blocknr, capacity;
|
||||||
uint32_t hc_c_size;
|
uint32_t hc_c_size;
|
||||||
uint64_t blocks;
|
uint64_t blocks;
|
||||||
|
|
||||||
// CMD9, Response R2 (R1 byte + 16-byte block read)
|
// CMD9, Response R2 (R1 byte + 16-byte block read)
|
||||||
if (_cmdx(9, 0) != 0) {
|
if (_cmdx(9, 0) != 0) {
|
||||||
debug("Didn't get a response from the disk\n");
|
debug("Didn't get a response from the disk\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t csd[16];
|
uint8_t csd[16];
|
||||||
if (_read(csd, 16) != 0) {
|
if (_read(csd, 16) != 0) {
|
||||||
debug("Couldn't read csd response from disk\n");
|
debug("Couldn't read csd response from disk\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// csd_structure : csd[127:126]
|
// csd_structure : csd[127:126]
|
||||||
// c_size : csd[73:62]
|
// c_size : csd[73:62]
|
||||||
// c_size_mult : csd[49:47]
|
// c_size_mult : csd[49:47]
|
||||||
// read_bl_len : csd[83:80] - the *maximum* read block length
|
// read_bl_len : csd[83:80] - the *maximum* read block length
|
||||||
|
|
||||||
int csd_structure = ext_bits(csd, 127, 126);
|
int csd_structure = ext_bits(csd, 127, 126);
|
||||||
|
|
||||||
switch (csd_structure) {
|
switch (csd_structure) {
|
||||||
case 0:
|
case 0:
|
||||||
cdv = 512;
|
cdv = 512;
|
||||||
c_size = ext_bits(csd, 73, 62);
|
c_size = ext_bits(csd, 73, 62);
|
||||||
c_size_mult = ext_bits(csd, 49, 47);
|
c_size_mult = ext_bits(csd, 49, 47);
|
||||||
read_bl_len = ext_bits(csd, 83, 80);
|
read_bl_len = ext_bits(csd, 83, 80);
|
||||||
|
|
||||||
block_len = 1 << read_bl_len;
|
block_len = 1 << read_bl_len;
|
||||||
mult = 1 << (c_size_mult + 2);
|
mult = 1 << (c_size_mult + 2);
|
||||||
blocknr = (c_size + 1) * mult;
|
blocknr = (c_size + 1) * mult;
|
||||||
|
@ -474,14 +474,14 @@ uint64_t SDFileSystem::_sd_sectors() {
|
||||||
blocks = capacity / 512;
|
blocks = capacity / 512;
|
||||||
debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks);
|
debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
cdv = 1;
|
cdv = 1;
|
||||||
hc_c_size = ext_bits(csd, 63, 48);
|
hc_c_size = ext_bits(csd, 63, 48);
|
||||||
blocks = (hc_c_size+1)*1024;
|
blocks = (hc_c_size+1)*1024;
|
||||||
debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks);
|
debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
debug("CSD struct unsupported\r\n");
|
debug("CSD struct unsupported\r\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
* #include "SDFileSystem.h"
|
* #include "SDFileSystem.h"
|
||||||
*
|
*
|
||||||
* SDFileSystem sd(p5, p6, p7, p12, "sd"); // mosi, miso, sclk, cs
|
* SDFileSystem sd(p5, p6, p7, p12, "sd"); // mosi, miso, sclk, cs
|
||||||
*
|
*
|
||||||
* int main() {
|
* int main() {
|
||||||
* FILE *fp = fopen("/sd/myfile.txt", "w");
|
* FILE *fp = fopen("/sd/myfile.txt", "w");
|
||||||
* fprintf(fp, "Hello World!\n");
|
* fprintf(fp, "Hello World!\n");
|
||||||
|
@ -68,7 +68,7 @@ protected:
|
||||||
int initialise_card();
|
int initialise_card();
|
||||||
int initialise_card_v1();
|
int initialise_card_v1();
|
||||||
int initialise_card_v2();
|
int initialise_card_v2();
|
||||||
|
|
||||||
int _read(uint8_t * buffer, uint32_t length);
|
int _read(uint8_t * buffer, uint32_t length);
|
||||||
int _write(const uint8_t *buffer, uint32_t length);
|
int _write(const uint8_t *buffer, uint32_t length);
|
||||||
uint64_t _sd_sectors();
|
uint64_t _sd_sectors();
|
||||||
|
|
|
@ -13,19 +13,19 @@ namespace mbed {
|
||||||
* @code
|
* @code
|
||||||
* #include "InterruptManager.h"
|
* #include "InterruptManager.h"
|
||||||
* #include "mbed.h"
|
* #include "mbed.h"
|
||||||
*
|
*
|
||||||
* Ticker flipper;
|
* Ticker flipper;
|
||||||
* DigitalOut led1(LED1);
|
* DigitalOut led1(LED1);
|
||||||
* DigitalOut led2(LED2);
|
* DigitalOut led2(LED2);
|
||||||
*
|
*
|
||||||
* void flip(void) {
|
* void flip(void) {
|
||||||
* led1 = !led1;
|
* led1 = !led1;
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* void handler(void) {
|
* void handler(void) {
|
||||||
* led2 = !led1;
|
* led2 = !led1;
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* int main() {
|
* int main() {
|
||||||
* led1 = led2 = 0;
|
* led1 = led2 = 0;
|
||||||
* flipper.attach(&flip, 1.0);
|
* flipper.attach(&flip, 1.0);
|
||||||
|
@ -42,7 +42,7 @@ public:
|
||||||
/** Destroy the current instance of the interrupt manager
|
/** Destroy the current instance of the interrupt manager
|
||||||
*/
|
*/
|
||||||
static void destroy();
|
static void destroy();
|
||||||
|
|
||||||
/** Add a handler for an interrupt at the end of the handler list
|
/** Add a handler for an interrupt at the end of the handler list
|
||||||
*
|
*
|
||||||
* @param function the handler to add
|
* @param function the handler to add
|
||||||
|
|
|
@ -58,7 +58,7 @@ pFunctionPointer_t InterruptManager::add_common(void (*function)(void), IRQn_Typ
|
||||||
|
|
||||||
bool InterruptManager::remove_handler(pFunctionPointer_t handler, IRQn_Type irq) {
|
bool InterruptManager::remove_handler(pFunctionPointer_t handler, IRQn_Type irq) {
|
||||||
int irq_pos = get_irq_index(irq);
|
int irq_pos = get_irq_index(irq);
|
||||||
|
|
||||||
if (NULL == _chains[irq_pos])
|
if (NULL == _chains[irq_pos])
|
||||||
return false;
|
return false;
|
||||||
if (!_chains[irq_pos]->remove(handler))
|
if (!_chains[irq_pos]->remove(handler))
|
||||||
|
|
|
@ -30,7 +30,7 @@ WEAK void mbed_die(void) {
|
||||||
gpio_t led_3; gpio_init_out(&led_3, LED3);
|
gpio_t led_3; gpio_init_out(&led_3, LED3);
|
||||||
gpio_t led_4; gpio_init_out(&led_4, LED4);
|
gpio_t led_4; gpio_init_out(&led_4, LED4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
#if (DEVICE_ERROR_RED == 1)
|
#if (DEVICE_ERROR_RED == 1)
|
||||||
gpio_write(&led_red, 1);
|
gpio_write(&led_red, 1);
|
||||||
|
@ -41,7 +41,7 @@ WEAK void mbed_die(void) {
|
||||||
gpio_write(&led_3, 0);
|
gpio_write(&led_3, 0);
|
||||||
gpio_write(&led_4, 1);
|
gpio_write(&led_4, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wait_ms(150);
|
wait_ms(150);
|
||||||
|
|
||||||
#if (DEVICE_ERROR_RED == 1)
|
#if (DEVICE_ERROR_RED == 1)
|
||||||
|
@ -53,7 +53,7 @@ WEAK void mbed_die(void) {
|
||||||
gpio_write(&led_3, 1);
|
gpio_write(&led_3, 1);
|
||||||
gpio_write(&led_4, 0);
|
gpio_write(&led_4, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wait_ms(150);
|
wait_ms(150);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,13 @@
|
||||||
|
|
||||||
static inline void _gpio_init_in(gpio_t* gpio, PinName pin, PinMode mode)
|
static inline void _gpio_init_in(gpio_t* gpio, PinName pin, PinMode mode)
|
||||||
{
|
{
|
||||||
gpio_init(gpio, pin);
|
gpio_init(gpio, pin);
|
||||||
if (pin != NC) {
|
if (pin != NC) {
|
||||||
gpio_dir(gpio, PIN_INPUT);
|
gpio_dir(gpio, PIN_INPUT);
|
||||||
gpio_mode(gpio, mode);
|
gpio_mode(gpio, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void _gpio_init_out(gpio_t* gpio, PinName pin, PinMode mode, int value)
|
static inline void _gpio_init_out(gpio_t* gpio, PinName pin, PinMode mode, int value)
|
||||||
{
|
{
|
||||||
gpio_init(gpio, pin);
|
gpio_init(gpio, pin);
|
||||||
|
|
|
@ -88,7 +88,7 @@ WEAK void mbed_mac_address(char *mac) {
|
||||||
#if DEVICE_SEMIHOST
|
#if DEVICE_SEMIHOST
|
||||||
char uid[DEVICE_ID_LENGTH + 1];
|
char uid[DEVICE_ID_LENGTH + 1];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// if we have a UID, extract the MAC
|
// if we have a UID, extract the MAC
|
||||||
if (mbed_interface_uid(uid) == 0) {
|
if (mbed_interface_uid(uid) == 0) {
|
||||||
char *p = uid;
|
char *p = uid;
|
||||||
|
|
|
@ -22,7 +22,7 @@ void pinmap_pinout(PinName pin, const PinMap *map) {
|
||||||
while (map->pin != NC) {
|
while (map->pin != NC) {
|
||||||
if (map->pin == pin) {
|
if (map->pin == pin) {
|
||||||
pin_function(pin, map->function);
|
pin_function(pin, map->function);
|
||||||
|
|
||||||
pin_mode(pin, PullNone);
|
pin_mode(pin, PullNone);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ extern "C" FILEHANDLE PREFIX(_open)(const char* name, int openmode) {
|
||||||
// This is the workaround that the microlib author suggested us
|
// This is the workaround that the microlib author suggested us
|
||||||
static int n = 0;
|
static int n = 0;
|
||||||
if (!std::strcmp(name, ":tt")) return n++;
|
if (!std::strcmp(name, ":tt")) return n++;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* Use the posix convention that stdin,out,err are filehandles 0,1,2.
|
/* Use the posix convention that stdin,out,err are filehandles 0,1,2.
|
||||||
*/
|
*/
|
||||||
|
@ -141,7 +141,7 @@ extern "C" FILEHANDLE PREFIX(_open)(const char* name, int openmode) {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// find the first empty slot in filehandles
|
// find the first empty slot in filehandles
|
||||||
unsigned int fh_i;
|
unsigned int fh_i;
|
||||||
for (fh_i = 0; fh_i < sizeof(filehandles)/sizeof(*filehandles); fh_i++) {
|
for (fh_i = 0; fh_i < sizeof(filehandles)/sizeof(*filehandles); fh_i++) {
|
||||||
|
@ -466,7 +466,7 @@ extern "C" caddr_t _sbrk(int incr) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return (caddr_t)-1;
|
return (caddr_t)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
heap = new_heap;
|
heap = new_heap;
|
||||||
return (caddr_t) prev_heap;
|
return (caddr_t) prev_heap;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#if defined (__ICCARM__)
|
#if defined (__ICCARM__)
|
||||||
time_t __time32(time_t *timer)
|
time_t __time32(time_t *timer)
|
||||||
#else
|
#else
|
||||||
|
@ -60,4 +60,4 @@ clock_t clock() {
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,13 +22,13 @@ static ticker_event_t *head = NULL;
|
||||||
|
|
||||||
void us_ticker_set_handler(ticker_event_handler handler) {
|
void us_ticker_set_handler(ticker_event_handler handler) {
|
||||||
us_ticker_init();
|
us_ticker_init();
|
||||||
|
|
||||||
event_handler = handler;
|
event_handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_irq_handler(void) {
|
void us_ticker_irq_handler(void) {
|
||||||
us_ticker_clear_interrupt();
|
us_ticker_clear_interrupt();
|
||||||
|
|
||||||
/* Go through all the pending TimerEvents */
|
/* Go through all the pending TimerEvents */
|
||||||
while (1) {
|
while (1) {
|
||||||
if (head == NULL) {
|
if (head == NULL) {
|
||||||
|
@ -36,7 +36,7 @@ void us_ticker_irq_handler(void) {
|
||||||
us_ticker_disable_interrupt();
|
us_ticker_disable_interrupt();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((int)(head->timestamp - us_ticker_read()) <= 0) {
|
if ((int)(head->timestamp - us_ticker_read()) <= 0) {
|
||||||
// This event was in the past:
|
// This event was in the past:
|
||||||
// point to the following one and execute its handler
|
// point to the following one and execute its handler
|
||||||
|
@ -57,11 +57,11 @@ void us_ticker_irq_handler(void) {
|
||||||
void us_ticker_insert_event(ticker_event_t *obj, unsigned int timestamp, uint32_t id) {
|
void us_ticker_insert_event(ticker_event_t *obj, unsigned int timestamp, uint32_t id) {
|
||||||
/* disable interrupts for the duration of the function */
|
/* disable interrupts for the duration of the function */
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
|
|
||||||
// initialise our data
|
// initialise our data
|
||||||
obj->timestamp = timestamp;
|
obj->timestamp = timestamp;
|
||||||
obj->id = id;
|
obj->id = id;
|
||||||
|
|
||||||
/* Go through the list until we either reach the end, or find
|
/* Go through the list until we either reach the end, or find
|
||||||
an element this should come before (which is possibly the
|
an element this should come before (which is possibly the
|
||||||
head). */
|
head). */
|
||||||
|
@ -84,13 +84,13 @@ void us_ticker_insert_event(ticker_event_t *obj, unsigned int timestamp, uint32_
|
||||||
}
|
}
|
||||||
/* if we're at the end p will be NULL, which is correct */
|
/* if we're at the end p will be NULL, which is correct */
|
||||||
obj->next = p;
|
obj->next = p;
|
||||||
|
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_remove_event(ticker_event_t *obj) {
|
void us_ticker_remove_event(ticker_event_t *obj) {
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
|
|
||||||
// remove this object from the list
|
// remove this object from the list
|
||||||
if (head == obj) {
|
if (head == obj) {
|
||||||
// first in the list, so just drop me
|
// first in the list, so just drop me
|
||||||
|
@ -109,6 +109,6 @@ void us_ticker_remove_event(ticker_event_t *obj) {
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,17 +42,17 @@ public:
|
||||||
#ifdef CMSIS_OS_RTX
|
#ifdef CMSIS_OS_RTX
|
||||||
memset(_mail_q, 0, sizeof(_mail_q));
|
memset(_mail_q, 0, sizeof(_mail_q));
|
||||||
_mail_p[0] = _mail_q;
|
_mail_p[0] = _mail_q;
|
||||||
|
|
||||||
memset(_mail_m, 0, sizeof(_mail_m));
|
memset(_mail_m, 0, sizeof(_mail_m));
|
||||||
_mail_p[1] = _mail_m;
|
_mail_p[1] = _mail_m;
|
||||||
|
|
||||||
_mail_def.pool = _mail_p;
|
_mail_def.pool = _mail_p;
|
||||||
_mail_def.queue_sz = queue_sz;
|
_mail_def.queue_sz = queue_sz;
|
||||||
_mail_def.item_sz = sizeof(T);
|
_mail_def.item_sz = sizeof(T);
|
||||||
#endif
|
#endif
|
||||||
_mail_id = osMailCreate(&_mail_def, NULL);
|
_mail_id = osMailCreate(&_mail_def, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T
|
/** Allocate a memory block of type T
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: 0).
|
@param millisec timeout value or 0 in case of no time-out. (default: 0).
|
||||||
@return pointer to memory block that can be filled with mail or NULL in case error.
|
@return pointer to memory block that can be filled with mail or NULL in case error.
|
||||||
|
@ -60,23 +60,23 @@ public:
|
||||||
T* alloc(uint32_t millisec=0) {
|
T* alloc(uint32_t millisec=0) {
|
||||||
return (T*)osMailAlloc(_mail_id, millisec);
|
return (T*)osMailAlloc(_mail_id, millisec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T and set memory block to zero.
|
/** Allocate a memory block of type T and set memory block to zero.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: 0).
|
@param millisec timeout value or 0 in case of no time-out. (default: 0).
|
||||||
@return pointer to memory block that can be filled with mail or NULL in case error.
|
@return pointer to memory block that can be filled with mail or NULL in case error.
|
||||||
*/
|
*/
|
||||||
T* calloc(uint32_t millisec=0) {
|
T* calloc(uint32_t millisec=0) {
|
||||||
return (T*)osMailCAlloc(_mail_id, millisec);
|
return (T*)osMailCAlloc(_mail_id, millisec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Put a mail in the queue.
|
/** Put a mail in the queue.
|
||||||
@param mptr memory block previously allocated with Mail::alloc or Mail::calloc.
|
@param mptr memory block previously allocated with Mail::alloc or Mail::calloc.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus put(T *mptr) {
|
osStatus put(T *mptr) {
|
||||||
return osMailPut(_mail_id, (void*)mptr);
|
return osMailPut(_mail_id, (void*)mptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get a mail from a queue.
|
/** Get a mail from a queue.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
||||||
@return event that contains mail information or error code.
|
@return event that contains mail information or error code.
|
||||||
|
@ -84,9 +84,9 @@ public:
|
||||||
osEvent get(uint32_t millisec=osWaitForever) {
|
osEvent get(uint32_t millisec=osWaitForever) {
|
||||||
return osMailGet(_mail_id, millisec);
|
return osMailGet(_mail_id, millisec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Free a memory block from a mail.
|
/** Free a memory block from a mail.
|
||||||
@param mptr pointer to the memory block that was obtained with Mail::get.
|
@param mptr pointer to the memory block that was obtained with Mail::get.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus free(T *mptr) {
|
osStatus free(T *mptr) {
|
||||||
|
|
|
@ -41,30 +41,30 @@ public:
|
||||||
#ifdef CMSIS_OS_RTX
|
#ifdef CMSIS_OS_RTX
|
||||||
memset(_pool_m, 0, sizeof(_pool_m));
|
memset(_pool_m, 0, sizeof(_pool_m));
|
||||||
_pool_def.pool = _pool_m;
|
_pool_def.pool = _pool_m;
|
||||||
|
|
||||||
_pool_def.pool_sz = pool_sz;
|
_pool_def.pool_sz = pool_sz;
|
||||||
_pool_def.item_sz = sizeof(T);
|
_pool_def.item_sz = sizeof(T);
|
||||||
#endif
|
#endif
|
||||||
_pool_id = osPoolCreate(&_pool_def);
|
_pool_id = osPoolCreate(&_pool_def);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T from a memory pool.
|
/** Allocate a memory block of type T from a memory pool.
|
||||||
@return address of the allocated memory block or NULL in case of no memory available.
|
@return address of the allocated memory block or NULL in case of no memory available.
|
||||||
*/
|
*/
|
||||||
T* alloc(void) {
|
T* alloc(void) {
|
||||||
return (T*)osPoolAlloc(_pool_id);
|
return (T*)osPoolAlloc(_pool_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T from a memory pool and set memory block to zero.
|
/** Allocate a memory block of type T from a memory pool and set memory block to zero.
|
||||||
@return address of the allocated memory block or NULL in case of no memory available.
|
@return address of the allocated memory block or NULL in case of no memory available.
|
||||||
*/
|
*/
|
||||||
T* calloc(void) {
|
T* calloc(void) {
|
||||||
return (T*)osPoolCAlloc(_pool_id);
|
return (T*)osPoolCAlloc(_pool_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return an allocated memory block back to a specific memory pool.
|
/** Return an allocated memory block back to a specific memory pool.
|
||||||
@param address of the allocated memory block that is returned to the memory pool.
|
@param address of the allocated memory block that is returned to the memory pool.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus free(T *block) {
|
osStatus free(T *block) {
|
||||||
return osPoolFree(_pool_id, (void*)block);
|
return osPoolFree(_pool_id, (void*)block);
|
||||||
|
|
|
@ -34,23 +34,23 @@ class Mutex {
|
||||||
public:
|
public:
|
||||||
/** Create and Initialize a Mutex object */
|
/** Create and Initialize a Mutex object */
|
||||||
Mutex();
|
Mutex();
|
||||||
|
|
||||||
/** Wait until a Mutex becomes available.
|
/** Wait until a Mutex becomes available.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever)
|
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever)
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus lock(uint32_t millisec=osWaitForever);
|
osStatus lock(uint32_t millisec=osWaitForever);
|
||||||
|
|
||||||
/** Try to lock the mutex, and return immediately
|
/** Try to lock the mutex, and return immediately
|
||||||
@return true if the mutex was acquired, false otherwise.
|
@return true if the mutex was acquired, false otherwise.
|
||||||
*/
|
*/
|
||||||
bool trylock();
|
bool trylock();
|
||||||
|
|
||||||
/** Unlock the mutex that has previously been locked by the same thread
|
/** Unlock the mutex that has previously been locked by the same thread
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus unlock();
|
osStatus unlock();
|
||||||
|
|
||||||
~Mutex();
|
~Mutex();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -51,16 +51,16 @@ public:
|
||||||
error("Error initialising the queue object\n");
|
error("Error initialising the queue object\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Put a message in a Queue.
|
/** Put a message in a Queue.
|
||||||
@param data message pointer.
|
@param data message pointer.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: 0)
|
@param millisec timeout value or 0 in case of no time-out. (default: 0)
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus put(T* data, uint32_t millisec=0) {
|
osStatus put(T* data, uint32_t millisec=0) {
|
||||||
return osMessagePut(_queue_id, (uint32_t)data, millisec);
|
return osMessagePut(_queue_id, (uint32_t)data, millisec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get a message or Wait for a message from a Queue.
|
/** Get a message or Wait for a message from a Queue.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
||||||
@return event information that includes the message and the status code.
|
@return event information that includes the message and the status code.
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace rtos {
|
||||||
RtosTimer::RtosTimer(void (*periodic_task)(void const *argument), os_timer_type type, void *argument) {
|
RtosTimer::RtosTimer(void (*periodic_task)(void const *argument), os_timer_type type, void *argument) {
|
||||||
#ifdef CMSIS_OS_RTX
|
#ifdef CMSIS_OS_RTX
|
||||||
_timer.ptimer = periodic_task;
|
_timer.ptimer = periodic_task;
|
||||||
|
|
||||||
memset(_timer_data, 0, sizeof(_timer_data));
|
memset(_timer_data, 0, sizeof(_timer_data));
|
||||||
_timer.timer = _timer_data;
|
_timer.timer = _timer_data;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace rtos {
|
||||||
periodic timers are possible. A timer can be started, restarted, or stopped.
|
periodic timers are possible. A timer can be started, restarted, or stopped.
|
||||||
|
|
||||||
Timers are handled in the thread osTimerThread.
|
Timers are handled in the thread osTimerThread.
|
||||||
Callback functions run under control of this thread and may use CMSIS-RTOS API calls.
|
Callback functions run under control of this thread and may use CMSIS-RTOS API calls.
|
||||||
*/
|
*/
|
||||||
class RtosTimer {
|
class RtosTimer {
|
||||||
public:
|
public:
|
||||||
|
@ -44,18 +44,18 @@ public:
|
||||||
RtosTimer(void (*task)(void const *argument),
|
RtosTimer(void (*task)(void const *argument),
|
||||||
os_timer_type type=osTimerPeriodic,
|
os_timer_type type=osTimerPeriodic,
|
||||||
void *argument=NULL);
|
void *argument=NULL);
|
||||||
|
|
||||||
/** Stop the timer.
|
/** Stop the timer.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus stop(void);
|
osStatus stop(void);
|
||||||
|
|
||||||
/** start a timer.
|
/** start a timer.
|
||||||
@param millisec time delay value of the timer.
|
@param millisec time delay value of the timer.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus start(uint32_t millisec);
|
osStatus start(uint32_t millisec);
|
||||||
|
|
||||||
~RtosTimer();
|
~RtosTimer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -30,22 +30,22 @@ namespace rtos {
|
||||||
/** The Semaphore class is used to manage and protect access to a set of shared resources. */
|
/** The Semaphore class is used to manage and protect access to a set of shared resources. */
|
||||||
class Semaphore {
|
class Semaphore {
|
||||||
public:
|
public:
|
||||||
/** Create and Initialize a Semaphore object used for managing resources.
|
/** Create and Initialize a Semaphore object used for managing resources.
|
||||||
@param number of available resources; maximum index value is (count-1).
|
@param number of available resources; maximum index value is (count-1).
|
||||||
*/
|
*/
|
||||||
Semaphore(int32_t count);
|
Semaphore(int32_t count);
|
||||||
|
|
||||||
/** Wait until a Semaphore resource becomes available.
|
/** Wait until a Semaphore resource becomes available.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
||||||
@return number of available tokens, or -1 in case of incorrect parameters
|
@return number of available tokens, or -1 in case of incorrect parameters
|
||||||
*/
|
*/
|
||||||
int32_t wait(uint32_t millisec=osWaitForever);
|
int32_t wait(uint32_t millisec=osWaitForever);
|
||||||
|
|
||||||
/** Release a Semaphore resource that was obtain with Semaphore::wait.
|
/** Release a Semaphore resource that was obtain with Semaphore::wait.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus release(void);
|
osStatus release(void);
|
||||||
|
|
||||||
~Semaphore();
|
~Semaphore();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -41,29 +41,29 @@ public:
|
||||||
osPriority priority=osPriorityNormal,
|
osPriority priority=osPriorityNormal,
|
||||||
uint32_t stack_size=DEFAULT_STACK_SIZE,
|
uint32_t stack_size=DEFAULT_STACK_SIZE,
|
||||||
unsigned char *stack_pointer=NULL);
|
unsigned char *stack_pointer=NULL);
|
||||||
|
|
||||||
/** Terminate execution of a thread and remove it from Active Threads
|
/** Terminate execution of a thread and remove it from Active Threads
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus terminate();
|
osStatus terminate();
|
||||||
|
|
||||||
/** Set priority of an active thread
|
/** Set priority of an active thread
|
||||||
@param priority new priority value for the thread function.
|
@param priority new priority value for the thread function.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
osStatus set_priority(osPriority priority);
|
osStatus set_priority(osPriority priority);
|
||||||
|
|
||||||
/** Get priority of an active thread
|
/** Get priority of an active thread
|
||||||
@return current priority value of the thread function.
|
@return current priority value of the thread function.
|
||||||
*/
|
*/
|
||||||
osPriority get_priority();
|
osPriority get_priority();
|
||||||
|
|
||||||
/** Set the specified Signal Flags of an active thread.
|
/** Set the specified Signal Flags of an active thread.
|
||||||
@param signals specifies the signal flags of the thread that should be set.
|
@param signals specifies the signal flags of the thread that should be set.
|
||||||
@return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters.
|
@return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters.
|
||||||
*/
|
*/
|
||||||
int32_t signal_set(int32_t signals);
|
int32_t signal_set(int32_t signals);
|
||||||
|
|
||||||
/** State of the Thread */
|
/** State of the Thread */
|
||||||
enum State {
|
enum State {
|
||||||
Inactive, /**< Not created or terminated */
|
Inactive, /**< Not created or terminated */
|
||||||
|
@ -77,35 +77,35 @@ public:
|
||||||
WaitingMailbox, /**< Waiting for a mailbox event to occur */
|
WaitingMailbox, /**< Waiting for a mailbox event to occur */
|
||||||
WaitingMutex, /**< Waiting for a mutex event to occur */
|
WaitingMutex, /**< Waiting for a mutex event to occur */
|
||||||
};
|
};
|
||||||
|
|
||||||
/** State of this Thread
|
/** State of this Thread
|
||||||
@return the State of this Thread
|
@return the State of this Thread
|
||||||
*/
|
*/
|
||||||
State get_state();
|
State get_state();
|
||||||
|
|
||||||
/** Wait for one or more Signal Flags to become signaled for the current RUNNING thread.
|
/** Wait for one or more Signal Flags to become signaled for the current RUNNING thread.
|
||||||
@param signals wait until all specified signal flags set or 0 for any single signal flag.
|
@param signals wait until all specified signal flags set or 0 for any single signal flag.
|
||||||
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
|
||||||
@return event flag information or error code.
|
@return event flag information or error code.
|
||||||
*/
|
*/
|
||||||
static osEvent signal_wait(int32_t signals, uint32_t millisec=osWaitForever);
|
static osEvent signal_wait(int32_t signals, uint32_t millisec=osWaitForever);
|
||||||
|
|
||||||
/** Wait for a specified time period in millisec:
|
/** Wait for a specified time period in millisec:
|
||||||
@param millisec time delay value
|
@param millisec time delay value
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
static osStatus wait(uint32_t millisec);
|
static osStatus wait(uint32_t millisec);
|
||||||
|
|
||||||
/** Pass control to next thread that is in state READY.
|
/** Pass control to next thread that is in state READY.
|
||||||
@return status code that indicates the execution status of the function.
|
@return status code that indicates the execution status of the function.
|
||||||
*/
|
*/
|
||||||
static osStatus yield();
|
static osStatus yield();
|
||||||
|
|
||||||
/** Get the thread id of the current running thread.
|
/** Get the thread id of the current running thread.
|
||||||
@return thread ID for reference by other functions or NULL in case of error.
|
@return thread ID for reference by other functions or NULL in case of error.
|
||||||
*/
|
*/
|
||||||
static osThreadId gettid();
|
static osThreadId gettid();
|
||||||
|
|
||||||
virtual ~Thread();
|
virtual ~Thread();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -58,7 +58,7 @@ void rt_init_stack (P_TCB p_TCB, FUNCP task_body) {
|
||||||
|
|
||||||
/* Prepare a complete interrupt frame for first task start */
|
/* Prepare a complete interrupt frame for first task start */
|
||||||
size = p_TCB->priv_stack >> 2;
|
size = p_TCB->priv_stack >> 2;
|
||||||
|
|
||||||
/* Write to the top of stack. */
|
/* Write to the top of stack. */
|
||||||
stk = &p_TCB->stack[size];
|
stk = &p_TCB->stack[size];
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ void rt_ret_val2(P_TCB p_TCB, U32 v0, U32 v1) {
|
||||||
|
|
||||||
#ifdef DBG_MSG
|
#ifdef DBG_MSG
|
||||||
void dbg_init (void) {
|
void dbg_init (void) {
|
||||||
if ((DEMCR & DEMCR_TRCENA) &&
|
if ((DEMCR & DEMCR_TRCENA) &&
|
||||||
(ITM_CONTROL & ITM_ITMENA) &&
|
(ITM_CONTROL & ITM_ITMENA) &&
|
||||||
(ITM_ENABLE & (1UL << 31))) {
|
(ITM_ENABLE & (1UL << 31))) {
|
||||||
dbg_msg = __TRUE;
|
dbg_msg = __TRUE;
|
||||||
|
|
|
@ -152,7 +152,7 @@ osMessageQId osMessageQId_osTimerMessageQ;
|
||||||
static uint32_t nr_mutex;
|
static uint32_t nr_mutex;
|
||||||
|
|
||||||
/*--------------------------- _mutex_initialize -----------------------------*/
|
/*--------------------------- _mutex_initialize -----------------------------*/
|
||||||
|
|
||||||
int _mutex_initialize (OS_ID *mutex) {
|
int _mutex_initialize (OS_ID *mutex) {
|
||||||
/* Allocate and initialize a system mutex. */
|
/* Allocate and initialize a system mutex. */
|
||||||
|
|
||||||
|
@ -263,7 +263,7 @@ extern unsigned char __end__[];
|
||||||
void set_main_stack(void) {
|
void set_main_stack(void) {
|
||||||
// That is the bottom of the main stack block: no collision detection
|
// That is the bottom of the main stack block: no collision detection
|
||||||
os_thread_def_main.stack_pointer = HEAP_START;
|
os_thread_def_main.stack_pointer = HEAP_START;
|
||||||
|
|
||||||
// Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts
|
// Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts
|
||||||
os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)HEAP_START) - (OS_SCHEDULERSTKSIZE * 4);
|
os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)HEAP_START) - (OS_SCHEDULERSTKSIZE * 4);
|
||||||
}
|
}
|
||||||
|
@ -282,7 +282,7 @@ void _main_init (void) {
|
||||||
|
|
||||||
/* The single memory model is checking for stack collision at run time, verifing
|
/* The single memory model is checking for stack collision at run time, verifing
|
||||||
that the heap pointer is underneath the stack pointer.
|
that the heap pointer is underneath the stack pointer.
|
||||||
|
|
||||||
With the RTOS there is not only one stack above the heap, there are multiple
|
With the RTOS there is not only one stack above the heap, there are multiple
|
||||||
stacks and some of them are underneath the heap pointer.
|
stacks and some of them are underneath the heap pointer.
|
||||||
*/
|
*/
|
||||||
|
@ -403,7 +403,7 @@ extern void exit(int arg);
|
||||||
|
|
||||||
__noreturn __stackless void __cmain(void) {
|
__noreturn __stackless void __cmain(void) {
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
if (__low_level_init() != 0) {
|
if (__low_level_init() != 0) {
|
||||||
__iar_data_init3();
|
__iar_data_init3();
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -93,8 +93,8 @@
|
||||||
#define OS_STKCHECK 1
|
#define OS_STKCHECK 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// <o>Processor mode for thread execution
|
// <o>Processor mode for thread execution
|
||||||
// <0=> Unprivileged mode
|
// <0=> Unprivileged mode
|
||||||
// <1=> Privileged mode
|
// <1=> Privileged mode
|
||||||
// <i> Default: Privileged mode
|
// <i> Default: Privileged mode
|
||||||
#ifndef OS_RUNPRIV
|
#ifndef OS_RUNPRIV
|
||||||
|
@ -211,7 +211,7 @@
|
||||||
|
|
||||||
// Standard library system mutexes
|
// Standard library system mutexes
|
||||||
// ===============================
|
// ===============================
|
||||||
// Define max. number system mutexes that are used to protect
|
// Define max. number system mutexes that are used to protect
|
||||||
// the arm standard runtime library. For microlib they are not used.
|
// the arm standard runtime library. For microlib they are not used.
|
||||||
#ifndef OS_MUTEXCNT
|
#ifndef OS_MUTEXCNT
|
||||||
#define OS_MUTEXCNT 12
|
#define OS_MUTEXCNT 12
|
||||||
|
@ -230,7 +230,7 @@
|
||||||
void os_idle_demon (void) {
|
void os_idle_demon (void) {
|
||||||
/* The idle demon is a system thread, running when no other thread is */
|
/* The idle demon is a system thread, running when no other thread is */
|
||||||
/* ready to run. */
|
/* ready to run. */
|
||||||
|
|
||||||
/* Sleep: ideally, we should put the chip to sleep.
|
/* Sleep: ideally, we should put the chip to sleep.
|
||||||
Unfortunately, this usually requires disconnecting the interface chip (debugger).
|
Unfortunately, this usually requires disconnecting the interface chip (debugger).
|
||||||
This can be done, but it would break the local file system.
|
This can be done, but it would break the local file system.
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -145,7 +145,7 @@ __asm void SVC_Handler (void) {
|
||||||
LDMIA R0,{R0-R3,R4} ; Read R0-R3,R12 from stack
|
LDMIA R0,{R0-R3,R4} ; Read R0-R3,R12 from stack
|
||||||
MOV R12,R4
|
MOV R12,R4
|
||||||
MOV R4,LR
|
MOV R4,LR
|
||||||
BLX R12 ; Call SVC Function
|
BLX R12 ; Call SVC Function
|
||||||
|
|
||||||
MRS R3,PSP ; Read PSP
|
MRS R3,PSP ; Read PSP
|
||||||
STMIA R3!,{R0-R2} ; Store return values
|
STMIA R3!,{R0-R2} ; Store return values
|
||||||
|
@ -161,14 +161,14 @@ __asm void SVC_Handler (void) {
|
||||||
|
|
||||||
MRS R0,PSP ; Read PSP
|
MRS R0,PSP ; Read PSP
|
||||||
SUBS R0,R0,#32 ; Adjust Start Address
|
SUBS R0,R0,#32 ; Adjust Start Address
|
||||||
STR R0,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
|
STR R0,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
|
||||||
STMIA R0!,{R4-R7} ; Save old context (R4-R7)
|
STMIA R0!,{R4-R7} ; Save old context (R4-R7)
|
||||||
MOV R4,R8
|
MOV R4,R8
|
||||||
MOV R5,R9
|
MOV R5,R9
|
||||||
MOV R6,R10
|
MOV R6,R10
|
||||||
MOV R7,R11
|
MOV R7,R11
|
||||||
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
||||||
|
|
||||||
PUSH {R2,R3}
|
PUSH {R2,R3}
|
||||||
BL rt_stk_check ; Check for Stack overflow
|
BL rt_stk_check ; Check for Stack overflow
|
||||||
POP {R2,R3}
|
POP {R2,R3}
|
||||||
|
@ -243,7 +243,7 @@ Sys_Switch
|
||||||
MOV R6,R10
|
MOV R6,R10
|
||||||
MOV R7,R11
|
MOV R7,R11
|
||||||
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
||||||
|
|
||||||
PUSH {R2,R3}
|
PUSH {R2,R3}
|
||||||
BL rt_stk_check ; Check for Stack overflow
|
BL rt_stk_check ; Check for Stack overflow
|
||||||
POP {R2,R3}
|
POP {R2,R3}
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -145,7 +145,7 @@ __asm void SVC_Handler (void) {
|
||||||
LDMIA R0,{R0-R3,R4} ; Read R0-R3,R12 from stack
|
LDMIA R0,{R0-R3,R4} ; Read R0-R3,R12 from stack
|
||||||
MOV R12,R4
|
MOV R12,R4
|
||||||
MOV R4,LR
|
MOV R4,LR
|
||||||
BLX R12 ; Call SVC Function
|
BLX R12 ; Call SVC Function
|
||||||
|
|
||||||
MRS R3,PSP ; Read PSP
|
MRS R3,PSP ; Read PSP
|
||||||
STMIA R3!,{R0-R2} ; Store return values
|
STMIA R3!,{R0-R2} ; Store return values
|
||||||
|
@ -161,14 +161,14 @@ __asm void SVC_Handler (void) {
|
||||||
|
|
||||||
MRS R0,PSP ; Read PSP
|
MRS R0,PSP ; Read PSP
|
||||||
SUBS R0,R0,#32 ; Adjust Start Address
|
SUBS R0,R0,#32 ; Adjust Start Address
|
||||||
STR R0,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
|
STR R0,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
|
||||||
STMIA R0!,{R4-R7} ; Save old context (R4-R7)
|
STMIA R0!,{R4-R7} ; Save old context (R4-R7)
|
||||||
MOV R4,R8
|
MOV R4,R8
|
||||||
MOV R5,R9
|
MOV R5,R9
|
||||||
MOV R6,R10
|
MOV R6,R10
|
||||||
MOV R7,R11
|
MOV R7,R11
|
||||||
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
||||||
|
|
||||||
PUSH {R2,R3}
|
PUSH {R2,R3}
|
||||||
BL rt_stk_check ; Check for Stack overflow
|
BL rt_stk_check ; Check for Stack overflow
|
||||||
POP {R2,R3}
|
POP {R2,R3}
|
||||||
|
@ -243,7 +243,7 @@ Sys_Switch
|
||||||
MOV R6,R10
|
MOV R6,R10
|
||||||
MOV R7,R11
|
MOV R7,R11
|
||||||
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
STMIA R0!,{R4-R7} ; Save old context (R8-R11)
|
||||||
|
|
||||||
PUSH {R2,R3}
|
PUSH {R2,R3}
|
||||||
BL rt_stk_check ; Check for Stack overflow
|
BL rt_stk_check ; Check for Stack overflow
|
||||||
POP {R2,R3}
|
POP {R2,R3}
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -130,7 +130,7 @@ __asm void SVC_Handler (void) {
|
||||||
CBNZ R1,SVC_User
|
CBNZ R1,SVC_User
|
||||||
|
|
||||||
LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
|
LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
|
||||||
BLX R12 ; Call SVC Function
|
BLX R12 ; Call SVC Function
|
||||||
|
|
||||||
MRS R12,PSP ; Read PSP
|
MRS R12,PSP ; Read PSP
|
||||||
STM R12,{R0-R2} ; Store return values
|
STM R12,{R0-R2} ; Store return values
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -126,7 +126,7 @@ __asm void SVC_Handler (void) {
|
||||||
|
|
||||||
#ifdef IFX_XMC4XXX
|
#ifdef IFX_XMC4XXX
|
||||||
EXPORT SVC_Handler_Veneer
|
EXPORT SVC_Handler_Veneer
|
||||||
SVC_Handler_Veneer
|
SVC_Handler_Veneer
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MRS R0,PSP ; Read PSP
|
MRS R0,PSP ; Read PSP
|
||||||
|
@ -136,7 +136,7 @@ SVC_Handler_Veneer
|
||||||
|
|
||||||
LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
|
LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
|
||||||
PUSH {R4,LR} ; Save EXC_RETURN
|
PUSH {R4,LR} ; Save EXC_RETURN
|
||||||
BLX R12 ; Call SVC Function
|
BLX R12 ; Call SVC Function
|
||||||
POP {R4,LR} ; Restore EXC_RETURN
|
POP {R4,LR} ; Restore EXC_RETURN
|
||||||
|
|
||||||
MRS R12,PSP ; Read PSP
|
MRS R12,PSP ; Read PSP
|
||||||
|
@ -216,7 +216,7 @@ __asm void PendSV_Handler (void) {
|
||||||
|
|
||||||
#ifdef IFX_XMC4XXX
|
#ifdef IFX_XMC4XXX
|
||||||
EXPORT PendSV_Handler_Veneer
|
EXPORT PendSV_Handler_Veneer
|
||||||
PendSV_Handler_Veneer
|
PendSV_Handler_Veneer
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PUSH {R4,LR} ; Save EXC_RETURN
|
PUSH {R4,LR} ; Save EXC_RETURN
|
||||||
|
@ -278,7 +278,7 @@ __asm void SysTick_Handler (void) {
|
||||||
|
|
||||||
#ifdef IFX_XMC4XXX
|
#ifdef IFX_XMC4XXX
|
||||||
EXPORT SysTick_Handler_Veneer
|
EXPORT SysTick_Handler_Veneer
|
||||||
SysTick_Handler_Veneer
|
SysTick_Handler_Veneer
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PUSH {R4,LR} ; Save EXC_RETURN
|
PUSH {R4,LR} ; Save EXC_RETURN
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* Copyright (C) 2012 ARM Limited. All rights reserved.
|
* Copyright (C) 2012 ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* $Date: 5. June 2012
|
* $Date: 5. June 2012
|
||||||
* $Revision: V1.01
|
* $Revision: V1.01
|
||||||
*
|
*
|
||||||
* Project: CMSIS-RTOS API
|
* Project: CMSIS-RTOS API
|
||||||
* Title: cmsis_os.h RTX header file
|
* Title: cmsis_os.h RTX header file
|
||||||
*
|
*
|
||||||
* Version 0.02
|
* Version 0.02
|
||||||
* Initial Proposal Phase
|
* Initial Proposal Phase
|
||||||
* Version 0.03
|
* Version 0.03
|
||||||
* osKernelStart added, optional feature: main started as thread
|
* osKernelStart added, optional feature: main started as thread
|
||||||
* osSemaphores have standard behavior
|
* osSemaphores have standard behavior
|
||||||
|
@ -16,11 +16,11 @@
|
||||||
* osThreadPass is renamed to osThreadYield
|
* osThreadPass is renamed to osThreadYield
|
||||||
* Version 1.01
|
* Version 1.01
|
||||||
* Support for C++ interface
|
* Support for C++ interface
|
||||||
* - const attribute removed from the osXxxxDef_t typedef's
|
* - const attribute removed from the osXxxxDef_t typedef's
|
||||||
* - const attribute added to the osXxxxDef macros
|
* - const attribute added to the osXxxxDef macros
|
||||||
* Added: osTimerDelete, osMutexDelete, osSemaphoreDelete
|
* Added: osTimerDelete, osMutexDelete, osSemaphoreDelete
|
||||||
* Added: osKernelInitialize
|
* Added: osKernelInitialize
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\page cmsis_os_h Header File Template: cmsis_os.h
|
\page cmsis_os_h Header File Template: cmsis_os.h
|
||||||
|
@ -41,8 +41,8 @@ The file cmsis_os.h contains:
|
||||||
All definitions are prefixed with \b os to give an unique name space for CMSIS-RTOS functions.
|
All definitions are prefixed with \b os to give an unique name space for CMSIS-RTOS functions.
|
||||||
Definitions that are prefixed \b os_ are not used in the application code but local to this header file.
|
Definitions that are prefixed \b os_ are not used in the application code but local to this header file.
|
||||||
All definitions and functions that belong to a module are grouped and have a common prefix, i.e. \b osThread.
|
All definitions and functions that belong to a module are grouped and have a common prefix, i.e. \b osThread.
|
||||||
|
|
||||||
Definitions that are marked with <b>CAN BE CHANGED</b> can be adapted towards the needs of the actual CMSIS-RTOS implementation.
|
Definitions that are marked with <b>CAN BE CHANGED</b> can be adapted towards the needs of the actual CMSIS-RTOS implementation.
|
||||||
These definitions can be specific to the underlying RTOS kernel.
|
These definitions can be specific to the underlying RTOS kernel.
|
||||||
|
|
||||||
Definitions that are marked with <b>MUST REMAIN UNCHANGED</b> cannot be altered. Otherwise the CMSIS-RTOS implementation is no longer
|
Definitions that are marked with <b>MUST REMAIN UNCHANGED</b> cannot be altered. Otherwise the CMSIS-RTOS implementation is no longer
|
||||||
|
@ -58,7 +58,7 @@ The following CMSIS-RTOS functions can be called from threads and interrupt serv
|
||||||
- \ref osMessagePut, \ref osMessageGet
|
- \ref osMessagePut, \ref osMessageGet
|
||||||
- \ref osMailAlloc, \ref osMailCAlloc, \ref osMailGet, \ref osMailPut, \ref osMailFree
|
- \ref osMailAlloc, \ref osMailCAlloc, \ref osMailGet, \ref osMailPut, \ref osMailFree
|
||||||
|
|
||||||
Functions that cannot be called from an ISR are verifying the interrupt status and return in case that they are called
|
Functions that cannot be called from an ISR are verifying the interrupt status and return in case that they are called
|
||||||
from an ISR context the status code \b osErrorISR. In some implementations this condition might be caught using the HARD FAULT vector.
|
from an ISR context the status code \b osErrorISR. In some implementations this condition might be caught using the HARD FAULT vector.
|
||||||
|
|
||||||
Some CMSIS-RTOS implementations support CMSIS-RTOS function calls from multiple ISR at the same time.
|
Some CMSIS-RTOS implementations support CMSIS-RTOS function calls from multiple ISR at the same time.
|
||||||
|
@ -79,11 +79,11 @@ extern void thread_sample (void const *argument); // function protot
|
||||||
osThreadDef (thread_sample, osPriorityBelowNormal, 1, 100);
|
osThreadDef (thread_sample, osPriorityBelowNormal, 1, 100);
|
||||||
|
|
||||||
// Pool definition
|
// Pool definition
|
||||||
osPoolDef(MyPool, 10, long);
|
osPoolDef(MyPool, 10, long);
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
|
|
||||||
This header file defines all objects when included in a C/C++ source file. When <b>\#define osObjectsExternal</b> is
|
This header file defines all objects when included in a C/C++ source file. When <b>\#define osObjectsExternal</b> is
|
||||||
present before the header file, the objects are defined as external symbols. A single consistent header file can therefore be
|
present before the header file, the objects are defined as external symbols. A single consistent header file can therefore be
|
||||||
used throughout the whole project.
|
used throughout the whole project.
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ used throughout the whole project.
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CMSIS_OS_H
|
#ifndef _CMSIS_OS_H
|
||||||
#define _CMSIS_OS_H
|
#define _CMSIS_OS_H
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ typedef enum {
|
||||||
osPriorityBelowNormal = -1, ///< priority: below normal
|
osPriorityBelowNormal = -1, ///< priority: below normal
|
||||||
osPriorityNormal = 0, ///< priority: normal (default)
|
osPriorityNormal = 0, ///< priority: normal (default)
|
||||||
osPriorityAboveNormal = +1, ///< priority: above normal
|
osPriorityAboveNormal = +1, ///< priority: above normal
|
||||||
osPriorityHigh = +2, ///< priority: high
|
osPriorityHigh = +2, ///< priority: high
|
||||||
osPriorityRealtime = +3, ///< priority: realtime (highest)
|
osPriorityRealtime = +3, ///< priority: realtime (highest)
|
||||||
osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority
|
osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority
|
||||||
} osPriority;
|
} osPriority;
|
||||||
|
@ -186,23 +186,23 @@ typedef enum {
|
||||||
osErrorValue = 0x86, ///< value of a parameter is out of range.
|
osErrorValue = 0x86, ///< value of a parameter is out of range.
|
||||||
osErrorOS = 0xFF, ///< unspecified RTOS error: run-time error but no other error message fits.
|
osErrorOS = 0xFF, ///< unspecified RTOS error: run-time error but no other error message fits.
|
||||||
os_status_reserved = 0x7FFFFFFF ///< prevent from enum down-size compiler optimization.
|
os_status_reserved = 0x7FFFFFFF ///< prevent from enum down-size compiler optimization.
|
||||||
} osStatus;
|
} osStatus;
|
||||||
|
|
||||||
|
|
||||||
/// Timer type value for the timer definition.
|
/// Timer type value for the timer definition.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b os_timer_type shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b os_timer_type shall be consistent in every CMSIS-RTOS.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
osTimerOnce = 0, ///< one-shot timer
|
osTimerOnce = 0, ///< one-shot timer
|
||||||
osTimerPeriodic = 1 ///< repeating timer
|
osTimerPeriodic = 1 ///< repeating timer
|
||||||
} os_timer_type;
|
} os_timer_type;
|
||||||
|
|
||||||
/// Entry point of a thread.
|
/// Entry point of a thread.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b os_pthread shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b os_pthread shall be consistent in every CMSIS-RTOS.
|
||||||
typedef void (*os_pthread) (void const *argument);
|
typedef void (*os_pthread) (void const *argument);
|
||||||
|
|
||||||
/// Entry point of a timer call back function.
|
/// Entry point of a timer call back function.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b os_ptimer shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b os_ptimer shall be consistent in every CMSIS-RTOS.
|
||||||
typedef void (*os_ptimer) (void const *argument);
|
typedef void (*os_ptimer) (void const *argument);
|
||||||
|
|
||||||
// >>> the following data type definitions may shall adapted towards a specific RTOS
|
// >>> the following data type definitions may shall adapted towards a specific RTOS
|
||||||
|
|
||||||
|
@ -268,7 +268,7 @@ typedef struct os_semaphore_def {
|
||||||
/// \note CAN BE CHANGED: \b os_pool_def is implementation specific in every CMSIS-RTOS.
|
/// \note CAN BE CHANGED: \b os_pool_def is implementation specific in every CMSIS-RTOS.
|
||||||
typedef struct os_pool_def {
|
typedef struct os_pool_def {
|
||||||
uint32_t pool_sz; ///< number of items (elements) in the pool
|
uint32_t pool_sz; ///< number of items (elements) in the pool
|
||||||
uint32_t item_sz; ///< size of an item
|
uint32_t item_sz; ///< size of an item
|
||||||
void *pool; ///< pointer to memory for pool
|
void *pool; ///< pointer to memory for pool
|
||||||
} osPoolDef_t;
|
} osPoolDef_t;
|
||||||
|
|
||||||
|
@ -283,23 +283,23 @@ typedef struct os_messageQ_def {
|
||||||
/// \note CAN BE CHANGED: \b os_mailQ_def is implementation specific in every CMSIS-RTOS.
|
/// \note CAN BE CHANGED: \b os_mailQ_def is implementation specific in every CMSIS-RTOS.
|
||||||
typedef struct os_mailQ_def {
|
typedef struct os_mailQ_def {
|
||||||
uint32_t queue_sz; ///< number of elements in the queue
|
uint32_t queue_sz; ///< number of elements in the queue
|
||||||
uint32_t item_sz; ///< size of an item
|
uint32_t item_sz; ///< size of an item
|
||||||
void *pool; ///< memory array for mail
|
void *pool; ///< memory array for mail
|
||||||
} osMailQDef_t;
|
} osMailQDef_t;
|
||||||
|
|
||||||
/// Event structure contains detailed information about an event.
|
/// Event structure contains detailed information about an event.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b os_event shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b os_event shall be consistent in every CMSIS-RTOS.
|
||||||
/// However the struct may be extended at the end.
|
/// However the struct may be extended at the end.
|
||||||
typedef struct {
|
typedef struct {
|
||||||
osStatus status; ///< status code: event or error information
|
osStatus status; ///< status code: event or error information
|
||||||
union {
|
union {
|
||||||
uint32_t v; ///< message as 32-bit value
|
uint32_t v; ///< message as 32-bit value
|
||||||
void *p; ///< message or mail as void pointer
|
void *p; ///< message or mail as void pointer
|
||||||
int32_t signals; ///< signal flags
|
int32_t signals; ///< signal flags
|
||||||
} value; ///< event value
|
} value; ///< event value
|
||||||
union {
|
union {
|
||||||
osMailQId mail_id; ///< mail id obtained by \ref osMailCreate
|
osMailQId mail_id; ///< mail id obtained by \ref osMailCreate
|
||||||
osMessageQId message_id; ///< message id obtained by \ref osMessageCreate
|
osMessageQId message_id; ///< message id obtained by \ref osMessageCreate
|
||||||
} def; ///< event definition
|
} def; ///< event definition
|
||||||
} osEvent;
|
} osEvent;
|
||||||
|
|
||||||
|
@ -308,16 +308,16 @@ typedef struct {
|
||||||
|
|
||||||
/// Initialize the RTOS Kernel for creating objects.
|
/// Initialize the RTOS Kernel for creating objects.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b osKernelInitialize shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b osKernelInitialize shall be consistent in every CMSIS-RTOS.
|
||||||
osStatus osKernelInitialize (void);
|
osStatus osKernelInitialize (void);
|
||||||
|
|
||||||
/// Start the RTOS Kernel.
|
/// Start the RTOS Kernel.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS.
|
||||||
osStatus osKernelStart (void);
|
osStatus osKernelStart (void);
|
||||||
|
|
||||||
/// Check if the RTOS kernel is already started.
|
/// Check if the RTOS kernel is already started.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b osKernelRunning shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b osKernelRunning shall be consistent in every CMSIS-RTOS.
|
||||||
/// \return 0 RTOS is not started, 1 RTOS is started.
|
/// \return 0 RTOS is not started, 1 RTOS is started.
|
||||||
int32_t osKernelRunning(void);
|
int32_t osKernelRunning(void);
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ int32_t osKernelRunning(void);
|
||||||
/// \param name name of the thread function.
|
/// \param name name of the thread function.
|
||||||
/// \param priority initial priority of the thread function.
|
/// \param priority initial priority of the thread function.
|
||||||
/// \param stacksz stack size (in bytes) requirements for the thread function.
|
/// \param stacksz stack size (in bytes) requirements for the thread function.
|
||||||
/// \note CAN BE CHANGED: The parameters to \b osThreadDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameters to \b osThreadDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osThreadDef(name, priority, stacksz) \
|
#define osThreadDef(name, priority, stacksz) \
|
||||||
|
@ -342,7 +342,7 @@ osThreadDef_t os_thread_def_##name = \
|
||||||
|
|
||||||
/// Access a Thread definition.
|
/// Access a Thread definition.
|
||||||
/// \param name name of the thread definition object.
|
/// \param name name of the thread definition object.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osThread shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osThread shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osThread(name) \
|
#define osThread(name) \
|
||||||
&os_thread_def_##name
|
&os_thread_def_##name
|
||||||
|
@ -370,7 +370,7 @@ osStatus osThreadTerminate (osThreadId thread_id);
|
||||||
/// \note MUST REMAIN UNCHANGED: \b osThreadYield shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b osThreadYield shall be consistent in every CMSIS-RTOS.
|
||||||
osStatus osThreadYield (void);
|
osStatus osThreadYield (void);
|
||||||
|
|
||||||
/// Change priority of an active thread.
|
/// Change priority of an active thread.
|
||||||
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
|
||||||
/// \param[in] priority new priority value for the thread function.
|
/// \param[in] priority new priority value for the thread function.
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
|
@ -387,7 +387,7 @@ osPriority osThreadGetPriority (osThreadId thread_id);
|
||||||
// ==== Generic Wait Functions ====
|
// ==== Generic Wait Functions ====
|
||||||
|
|
||||||
/// Wait for Timeout (Time Delay).
|
/// Wait for Timeout (Time Delay).
|
||||||
/// \param[in] millisec time delay value
|
/// \param[in] millisec time delay value
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
osStatus osDelay (uint32_t millisec);
|
osStatus osDelay (uint32_t millisec);
|
||||||
|
|
||||||
|
@ -406,7 +406,7 @@ os_InRegs osEvent osWait (uint32_t millisec);
|
||||||
/// Define a Timer object.
|
/// Define a Timer object.
|
||||||
/// \param name name of the timer object.
|
/// \param name name of the timer object.
|
||||||
/// \param function name of the timer call back function.
|
/// \param function name of the timer call back function.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osTimerDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osTimerDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osTimerDef(name, function) \
|
#define osTimerDef(name, function) \
|
||||||
|
@ -420,7 +420,7 @@ osTimerDef_t os_timer_def_##name = \
|
||||||
|
|
||||||
/// Access a Timer definition.
|
/// Access a Timer definition.
|
||||||
/// \param name name of the timer object.
|
/// \param name name of the timer object.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osTimer shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osTimer shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osTimer(name) \
|
#define osTimer(name) \
|
||||||
&os_timer_def_##name
|
&os_timer_def_##name
|
||||||
|
@ -487,7 +487,7 @@ os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisec);
|
||||||
|
|
||||||
/// Define a Mutex.
|
/// Define a Mutex.
|
||||||
/// \param name name of the mutex object.
|
/// \param name name of the mutex object.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osMutexDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osMutexDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osMutexDef(name) \
|
#define osMutexDef(name) \
|
||||||
|
@ -500,7 +500,7 @@ osMutexDef_t os_mutex_def_##name = { (os_mutex_cb_##name) }
|
||||||
|
|
||||||
/// Access a Mutex definition.
|
/// Access a Mutex definition.
|
||||||
/// \param name name of the mutex object.
|
/// \param name name of the mutex object.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osMutex shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osMutex shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osMutex(name) \
|
#define osMutex(name) \
|
||||||
&os_mutex_def_##name
|
&os_mutex_def_##name
|
||||||
|
@ -537,7 +537,7 @@ osStatus osMutexDelete (osMutexId mutex_id);
|
||||||
|
|
||||||
/// Define a Semaphore object.
|
/// Define a Semaphore object.
|
||||||
/// \param name name of the semaphore object.
|
/// \param name name of the semaphore object.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osSemaphoreDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osSemaphoreDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osSemaphoreDef(name) \
|
#define osSemaphoreDef(name) \
|
||||||
|
@ -550,7 +550,7 @@ osSemaphoreDef_t os_semaphore_def_##name = { (os_semaphore_cb_##name) }
|
||||||
|
|
||||||
/// Access a Semaphore definition.
|
/// Access a Semaphore definition.
|
||||||
/// \param name name of the semaphore object.
|
/// \param name name of the semaphore object.
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osSemaphore shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osSemaphore shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osSemaphore(name) \
|
#define osSemaphore(name) \
|
||||||
&os_semaphore_def_##name
|
&os_semaphore_def_##name
|
||||||
|
@ -583,7 +583,7 @@ osStatus osSemaphoreDelete (osSemaphoreId semaphore_id);
|
||||||
|
|
||||||
#endif // Semaphore available
|
#endif // Semaphore available
|
||||||
|
|
||||||
|
|
||||||
// ==== Memory Pool Management Functions ====
|
// ==== Memory Pool Management Functions ====
|
||||||
|
|
||||||
#if (defined (osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool Management available
|
#if (defined (osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool Management available
|
||||||
|
@ -592,7 +592,7 @@ osStatus osSemaphoreDelete (osSemaphoreId semaphore_id);
|
||||||
/// \param name name of the memory pool.
|
/// \param name name of the memory pool.
|
||||||
/// \param no maximum number of blocks (objects) in the memory pool.
|
/// \param no maximum number of blocks (objects) in the memory pool.
|
||||||
/// \param type data type of a single block (object).
|
/// \param type data type of a single block (object).
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osPoolDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osPoolDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osPoolDef(name, no, type) \
|
#define osPoolDef(name, no, type) \
|
||||||
|
@ -606,7 +606,7 @@ osPoolDef_t os_pool_def_##name = \
|
||||||
|
|
||||||
/// \brief Access a Memory Pool definition.
|
/// \brief Access a Memory Pool definition.
|
||||||
/// \param name name of the memory pool
|
/// \param name name of the memory pool
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osPool shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osPool shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osPool(name) \
|
#define osPool(name) \
|
||||||
&os_pool_def_##name
|
&os_pool_def_##name
|
||||||
|
@ -647,7 +647,7 @@ osStatus osPoolFree (osPoolId pool_id, void *block);
|
||||||
/// \param name name of the queue.
|
/// \param name name of the queue.
|
||||||
/// \param queue_sz maximum number of messages in the queue.
|
/// \param queue_sz maximum number of messages in the queue.
|
||||||
/// \param type data type of a single message element (for debugger).
|
/// \param type data type of a single message element (for debugger).
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osMessageQDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osMessageQDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osMessageQDef(name, queue_sz, type) \
|
#define osMessageQDef(name, queue_sz, type) \
|
||||||
|
@ -661,7 +661,7 @@ osMessageQDef_t os_messageQ_def_##name = \
|
||||||
|
|
||||||
/// \brief Access a Message Queue Definition.
|
/// \brief Access a Message Queue Definition.
|
||||||
/// \param name name of the queue
|
/// \param name name of the queue
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osMessageQ shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osMessageQ shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osMessageQ(name) \
|
#define osMessageQ(name) \
|
||||||
&os_messageQ_def_##name
|
&os_messageQ_def_##name
|
||||||
|
@ -699,7 +699,7 @@ os_InRegs osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec);
|
||||||
/// \param name name of the queue
|
/// \param name name of the queue
|
||||||
/// \param queue_sz maximum number of messages in queue
|
/// \param queue_sz maximum number of messages in queue
|
||||||
/// \param type data type of a single message element
|
/// \param type data type of a single message element
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osMailQDef shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osMailQDef shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#if defined (osObjectsExternal) // object is external
|
#if defined (osObjectsExternal) // object is external
|
||||||
#define osMailQDef(name, queue_sz, type) \
|
#define osMailQDef(name, queue_sz, type) \
|
||||||
|
@ -712,10 +712,10 @@ void * os_mailQ_p_##name[2] = { (os_mailQ_q_##name), os_mailQ_m_##name }; \
|
||||||
osMailQDef_t os_mailQ_def_##name = \
|
osMailQDef_t os_mailQ_def_##name = \
|
||||||
{ (queue_sz), sizeof(type), (os_mailQ_p_##name) }
|
{ (queue_sz), sizeof(type), (os_mailQ_p_##name) }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// \brief Access a Mail Queue Definition.
|
/// \brief Access a Mail Queue Definition.
|
||||||
/// \param name name of the queue
|
/// \param name name of the queue
|
||||||
/// \note CAN BE CHANGED: The parameter to \b osMailQ shall be consistent but the
|
/// \note CAN BE CHANGED: The parameter to \b osMailQ shall be consistent but the
|
||||||
/// macro body is implementation specific in every CMSIS-RTOS.
|
/// macro body is implementation specific in every CMSIS-RTOS.
|
||||||
#define osMailQ(name) \
|
#define osMailQ(name) \
|
||||||
&os_mailQ_def_##name
|
&os_mailQ_def_##name
|
||||||
|
@ -761,7 +761,7 @@ os_InRegs osEvent osMailGet (osMailQId queue_id, uint32_t millisec);
|
||||||
/// \return status code that indicates the execution status of the function.
|
/// \return status code that indicates the execution status of the function.
|
||||||
/// \note MUST REMAIN UNCHANGED: \b osMailFree shall be consistent in every CMSIS-RTOS.
|
/// \note MUST REMAIN UNCHANGED: \b osMailFree shall be consistent in every CMSIS-RTOS.
|
||||||
osStatus osMailFree (osMailQId queue_id, void *mail);
|
osStatus osMailFree (osMailQId queue_id, void *mail);
|
||||||
|
|
||||||
#endif // Mail Queues available
|
#endif // Mail Queues available
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,13 +36,13 @@ typedef struct OS_TCB {
|
||||||
U16 priv_stack; /* Private stack size in bytes */
|
U16 priv_stack; /* Private stack size in bytes */
|
||||||
U32 tsk_stack; /* Current task Stack pointer (R13) */
|
U32 tsk_stack; /* Current task Stack pointer (R13) */
|
||||||
U32 *stack; /* Pointer to Task Stack memory block */
|
U32 *stack; /* Pointer to Task Stack memory block */
|
||||||
|
|
||||||
/* Library dependant part */
|
/* Library dependant part */
|
||||||
#if defined (__CC_ARM) && !defined (__MICROLIB)
|
#if defined (__CC_ARM) && !defined (__MICROLIB)
|
||||||
/* A memory space for arm standard library. */
|
/* A memory space for arm standard library. */
|
||||||
U32 std_libspace[96/4];
|
U32 std_libspace[96/4];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Task entry point used for uVision debugger */
|
/* Task entry point used for uVision debugger */
|
||||||
FUNCP ptask; /* Task entry address */
|
FUNCP ptask; /* Task entry address */
|
||||||
} *P_TCB;
|
} *P_TCB;
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -131,9 +131,9 @@ static __inline t __##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
|
||||||
return _##f(f,a1,a2,a3,a4); \
|
return _##f(f,a1,a2,a3,a4); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SVC_1_2 SVC_1_1
|
#define SVC_1_2 SVC_1_1
|
||||||
#define SVC_1_3 SVC_1_1
|
#define SVC_1_3 SVC_1_1
|
||||||
#define SVC_2_3 SVC_2_1
|
#define SVC_2_3 SVC_2_1
|
||||||
|
|
||||||
#elif defined (__GNUC__) /* GNU Compiler */
|
#elif defined (__GNUC__) /* GNU Compiler */
|
||||||
|
|
||||||
|
@ -257,9 +257,9 @@ static inline t __##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
|
||||||
return (t) rv; \
|
return (t) rv; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SVC_1_2 SVC_1_1
|
#define SVC_1_2 SVC_1_1
|
||||||
#define SVC_1_3 SVC_1_1
|
#define SVC_1_3 SVC_1_1
|
||||||
#define SVC_2_3 SVC_2_1
|
#define SVC_2_3 SVC_2_1
|
||||||
|
|
||||||
#elif defined (__ICCARM__) /* IAR Compiler */
|
#elif defined (__ICCARM__) /* IAR Compiler */
|
||||||
|
|
||||||
|
@ -405,7 +405,7 @@ static uint32_t rt_ms2tick (uint32_t millisec) {
|
||||||
|
|
||||||
tick = ((1000 * millisec) + os_clockrate - 1) / os_clockrate;
|
tick = ((1000 * millisec) + os_clockrate - 1) / os_clockrate;
|
||||||
if (tick > 0xFFFE) return 0xFFFE;
|
if (tick > 0xFFFE) return 0xFFFE;
|
||||||
|
|
||||||
return tick;
|
return tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,12 +517,12 @@ osStatus osKernelInitialize (void) {
|
||||||
/// Start the RTOS Kernel
|
/// Start the RTOS Kernel
|
||||||
osStatus osKernelStart (void) {
|
osStatus osKernelStart (void) {
|
||||||
uint32_t stack[8];
|
uint32_t stack[8];
|
||||||
|
|
||||||
if (__get_IPSR() != 0) return osErrorISR; // Not allowed in ISR
|
if (__get_IPSR() != 0) return osErrorISR; // Not allowed in ISR
|
||||||
switch (__get_CONTROL() & 0x03) {
|
switch (__get_CONTROL() & 0x03) {
|
||||||
case 0x00: // Privileged Thread mode & MSP
|
case 0x00: // Privileged Thread mode & MSP
|
||||||
__set_PSP((uint32_t)(stack + 8)); // Initial PSP
|
__set_PSP((uint32_t)(stack + 8)); // Initial PSP
|
||||||
if (os_flags & 1) {
|
if (os_flags & 1) {
|
||||||
__set_CONTROL(0x02); // Set Privileged Thread mode & PSP
|
__set_CONTROL(0x02); // Set Privileged Thread mode & PSP
|
||||||
} else {
|
} else {
|
||||||
__set_CONTROL(0x03); // Set Unprivileged Thread mode & PSP
|
__set_CONTROL(0x03); // Set Unprivileged Thread mode & PSP
|
||||||
|
@ -576,20 +576,20 @@ extern void rt_init_context (P_TCB p_TCB, U8 priority, FUNCP task_body);
|
||||||
/// Create a thread and add it to Active Threads and set it to state READY
|
/// Create a thread and add it to Active Threads and set it to state READY
|
||||||
osThreadId svcThreadCreate (osThreadDef_t *thread_def, void *argument) {
|
osThreadId svcThreadCreate (osThreadDef_t *thread_def, void *argument) {
|
||||||
P_TCB ptcb;
|
P_TCB ptcb;
|
||||||
|
|
||||||
if ((thread_def == NULL) ||
|
if ((thread_def == NULL) ||
|
||||||
(thread_def->pthread == NULL) ||
|
(thread_def->pthread == NULL) ||
|
||||||
(thread_def->tpriority < osPriorityIdle) ||
|
(thread_def->tpriority < osPriorityIdle) ||
|
||||||
(thread_def->tpriority > osPriorityRealtime) ||
|
(thread_def->tpriority > osPriorityRealtime) ||
|
||||||
(thread_def->stacksize == 0) ||
|
(thread_def->stacksize == 0) ||
|
||||||
(thread_def->stack_pointer == NULL) ) {
|
(thread_def->stack_pointer == NULL) ) {
|
||||||
sysThreadError(osErrorParameter);
|
sysThreadError(osErrorParameter);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
U8 priority = thread_def->tpriority - osPriorityIdle + 1;
|
U8 priority = thread_def->tpriority - osPriorityIdle + 1;
|
||||||
P_TCB task_context = &thread_def->tcb;
|
P_TCB task_context = &thread_def->tcb;
|
||||||
|
|
||||||
/* If "size != 0" use a private user provided stack. */
|
/* If "size != 0" use a private user provided stack. */
|
||||||
task_context->stack = (U32*)thread_def->stack_pointer;
|
task_context->stack = (U32*)thread_def->stack_pointer;
|
||||||
task_context->priv_stack = thread_def->stacksize;
|
task_context->priv_stack = thread_def->stacksize;
|
||||||
|
@ -604,7 +604,7 @@ osThreadId svcThreadCreate (osThreadDef_t *thread_def, void *argument) {
|
||||||
task_context->task_id = tsk;
|
task_context->task_id = tsk;
|
||||||
DBG_TASK_NOTIFY(task_context, __TRUE);
|
DBG_TASK_NOTIFY(task_context, __TRUE);
|
||||||
rt_dispatch (task_context);
|
rt_dispatch (task_context);
|
||||||
|
|
||||||
ptcb = (P_TCB)os_active_TCB[tsk - 1]; // TCB pointer
|
ptcb = (P_TCB)os_active_TCB[tsk - 1]; // TCB pointer
|
||||||
|
|
||||||
*((uint32_t *)ptcb->tsk_stack + 13) = (uint32_t)osThreadExit;
|
*((uint32_t *)ptcb->tsk_stack + 13) = (uint32_t)osThreadExit;
|
||||||
|
@ -625,14 +625,14 @@ osThreadId svcThreadGetId (void) {
|
||||||
osStatus svcThreadTerminate (osThreadId thread_id) {
|
osStatus svcThreadTerminate (osThreadId thread_id) {
|
||||||
OS_RESULT res;
|
OS_RESULT res;
|
||||||
P_TCB ptcb;
|
P_TCB ptcb;
|
||||||
|
|
||||||
ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
|
ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
|
||||||
if (ptcb == NULL) return osErrorParameter;
|
if (ptcb == NULL) return osErrorParameter;
|
||||||
|
|
||||||
res = rt_tsk_delete(ptcb->task_id); // Delete task
|
res = rt_tsk_delete(ptcb->task_id); // Delete task
|
||||||
|
|
||||||
if (res == OS_R_NOK) return osErrorResource; // Delete task failed
|
if (res == OS_R_NOK) return osErrorResource; // Delete task failed
|
||||||
|
|
||||||
return osOK;
|
return osOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -671,7 +671,7 @@ osPriority svcThreadGetPriority (osThreadId thread_id) {
|
||||||
ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
|
ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
|
||||||
if (ptcb == NULL) return osPriorityError;
|
if (ptcb == NULL) return osPriorityError;
|
||||||
|
|
||||||
return (osPriority)(ptcb->prio - 1 + osPriorityIdle);
|
return (osPriority)(ptcb->prio - 1 + osPriorityIdle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -720,8 +720,8 @@ osPriority osThreadGetPriority (osThreadId thread_id) {
|
||||||
|
|
||||||
/// INTERNAL - Not Public
|
/// INTERNAL - Not Public
|
||||||
/// Auto Terminate Thread on exit (used implicitly when thread exists)
|
/// Auto Terminate Thread on exit (used implicitly when thread exists)
|
||||||
__NO_RETURN void osThreadExit (void) {
|
__NO_RETURN void osThreadExit (void) {
|
||||||
__svcThreadTerminate(__svcThreadGetId());
|
__svcThreadTerminate(__svcThreadGetId());
|
||||||
for (;;); // Should never come here
|
for (;;); // Should never come here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -794,7 +794,7 @@ os_InRegs osEvent osWait (uint32_t millisec) {
|
||||||
#define osTimerStopped 1
|
#define osTimerStopped 1
|
||||||
#define osTimerRunning 2
|
#define osTimerRunning 2
|
||||||
|
|
||||||
// Timer structures
|
// Timer structures
|
||||||
|
|
||||||
typedef struct os_timer_cb_ { // Timer Control Block
|
typedef struct os_timer_cb_ { // Timer Control Block
|
||||||
struct os_timer_cb_ *next; // Pointer to next active Timer
|
struct os_timer_cb_ *next; // Pointer to next active Timer
|
||||||
|
@ -802,7 +802,7 @@ typedef struct os_timer_cb_ { // Timer Control Block
|
||||||
uint8_t type; // Timer Type (Periodic/One-shot)
|
uint8_t type; // Timer Type (Periodic/One-shot)
|
||||||
uint16_t reserved; // Reserved
|
uint16_t reserved; // Reserved
|
||||||
uint16_t tcnt; // Timer Delay Count
|
uint16_t tcnt; // Timer Delay Count
|
||||||
uint16_t icnt; // Timer Initial Count
|
uint16_t icnt; // Timer Initial Count
|
||||||
void *arg; // Timer Function Argument
|
void *arg; // Timer Function Argument
|
||||||
osTimerDef_t *timer; // Pointer to Timer definition
|
osTimerDef_t *timer; // Pointer to Timer definition
|
||||||
} os_timer_cb;
|
} os_timer_cb;
|
||||||
|
@ -933,7 +933,7 @@ osStatus svcTimerStart (osTimerId timer_id, uint32_t millisec) {
|
||||||
default:
|
default:
|
||||||
return osErrorResource;
|
return osErrorResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
rt_timer_insert(pt, tcnt);
|
rt_timer_insert(pt, tcnt);
|
||||||
|
|
||||||
return osOK;
|
return osOK;
|
||||||
|
@ -1054,8 +1054,8 @@ osStatus osTimerDelete (osTimerId timer_id) {
|
||||||
|
|
||||||
/// INTERNAL - Not Public
|
/// INTERNAL - Not Public
|
||||||
/// Get timer callback parameters (used by OS Timer Thread)
|
/// Get timer callback parameters (used by OS Timer Thread)
|
||||||
os_InRegs osCallback osTimerCall (osTimerId timer_id) {
|
os_InRegs osCallback osTimerCall (osTimerId timer_id) {
|
||||||
return __svcTimerCall(timer_id);
|
return __svcTimerCall(timer_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1183,7 +1183,7 @@ static __INLINE int32_t isrSignalSet (osThreadId thread_id, int32_t signals) {
|
||||||
/// Set the specified Signal Flags of an active thread
|
/// Set the specified Signal Flags of an active thread
|
||||||
int32_t osSignalSet (osThreadId thread_id, int32_t signals) {
|
int32_t osSignalSet (osThreadId thread_id, int32_t signals) {
|
||||||
if (__get_IPSR() != 0) { // in ISR
|
if (__get_IPSR() != 0) { // in ISR
|
||||||
return isrSignalSet(thread_id, signals);
|
return isrSignalSet(thread_id, signals);
|
||||||
} else { // in Thread
|
} else { // in Thread
|
||||||
return __svcSignalSet(thread_id, signals);
|
return __svcSignalSet(thread_id, signals);
|
||||||
}
|
}
|
||||||
|
@ -1367,7 +1367,7 @@ osSemaphoreId svcSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
rt_sem_init(sem, count); // Initialize Semaphore
|
rt_sem_init(sem, count); // Initialize Semaphore
|
||||||
|
|
||||||
return sem;
|
return sem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1398,7 +1398,7 @@ osStatus svcSemaphoreRelease (osSemaphoreId semaphore_id) {
|
||||||
if (((P_SCB)sem)->cb_type != SCB) return osErrorParameter;
|
if (((P_SCB)sem)->cb_type != SCB) return osErrorParameter;
|
||||||
|
|
||||||
if (((P_SCB)sem)->tokens == osFeature_Semaphore) return osErrorResource;
|
if (((P_SCB)sem)->tokens == osFeature_Semaphore) return osErrorResource;
|
||||||
|
|
||||||
rt_sem_send(sem); // Release Semaphore
|
rt_sem_send(sem); // Release Semaphore
|
||||||
|
|
||||||
return osOK;
|
return osOK;
|
||||||
|
@ -1532,7 +1532,7 @@ void *sysPoolAlloc (osPoolId pool_id, uint32_t clr) {
|
||||||
/// Return an allocated memory block back to a specific memory pool
|
/// Return an allocated memory block back to a specific memory pool
|
||||||
osStatus sysPoolFree (osPoolId pool_id, void *block) {
|
osStatus sysPoolFree (osPoolId pool_id, void *block) {
|
||||||
int32_t res;
|
int32_t res;
|
||||||
|
|
||||||
if (pool_id == NULL) return osErrorParameter;
|
if (pool_id == NULL) return osErrorParameter;
|
||||||
|
|
||||||
res = rt_free_box(pool_id, block);
|
res = rt_free_box(pool_id, block);
|
||||||
|
@ -1601,7 +1601,7 @@ osMessageQId svcMessageCreate (osMessageQDef_t *queue_def, osThreadId thread_id)
|
||||||
sysThreadError(osErrorParameter);
|
sysThreadError(osErrorParameter);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((P_MCB)queue_def->pool)->cb_type != 0) {
|
if (((P_MCB)queue_def->pool)->cb_type != 0) {
|
||||||
sysThreadError(osErrorParameter);
|
sysThreadError(osErrorParameter);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1645,7 +1645,7 @@ os_InRegs osEvent_type svcMessageGet (osMessageQId queue_id, uint32_t millisec)
|
||||||
}
|
}
|
||||||
|
|
||||||
res = rt_mbx_wait(queue_id, &ret.value.p, rt_ms2tick(millisec));
|
res = rt_mbx_wait(queue_id, &ret.value.p, rt_ms2tick(millisec));
|
||||||
|
|
||||||
if (res == OS_R_TMO) {
|
if (res == OS_R_TMO) {
|
||||||
ret.status = millisec ? osEventTimeout : osOK;
|
ret.status = millisec ? osEventTimeout : osOK;
|
||||||
return osEvent_ret_value;
|
return osEvent_ret_value;
|
||||||
|
@ -1693,13 +1693,13 @@ static __INLINE os_InRegs osEvent isrMessageGet (osMessageQId queue_id, uint32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
res = isr_mbx_receive(queue_id, &ret.value.p);
|
res = isr_mbx_receive(queue_id, &ret.value.p);
|
||||||
|
|
||||||
if (res != OS_R_MBX) {
|
if (res != OS_R_MBX) {
|
||||||
ret.status = osOK;
|
ret.status = osOK;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.status = osEventMessage;
|
ret.status = osEventMessage;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1812,7 +1812,7 @@ void *sysMailAlloc (osMailQId queue_id, uint32_t millisec, uint32_t isr, uint32_
|
||||||
rt_block(rt_ms2tick(millisec), WAIT_MBX);
|
rt_block(rt_ms2tick(millisec), WAIT_MBX);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Free a memory block from a mail
|
/// Free a memory block from a mail
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -108,7 +108,7 @@ wkup: p_tcb->events &= ~event_flags;
|
||||||
rt_rmv_dly (p_tcb);
|
rt_rmv_dly (p_tcb);
|
||||||
p_tcb->state = READY;
|
p_tcb->state = READY;
|
||||||
#ifdef __CMSIS_RTOS
|
#ifdef __CMSIS_RTOS
|
||||||
rt_ret_val2(p_tcb, 0x08/*osEventSignal*/, p_tcb->waits);
|
rt_ret_val2(p_tcb, 0x08/*osEventSignal*/, p_tcb->waits);
|
||||||
#else
|
#else
|
||||||
rt_ret_val (p_tcb, OS_R_EVT);
|
rt_ret_val (p_tcb, OS_R_EVT);
|
||||||
#endif
|
#endif
|
||||||
|
@ -176,7 +176,7 @@ rdy: p_CB->events &= ~event_flags;
|
||||||
rt_rmv_dly (p_CB);
|
rt_rmv_dly (p_CB);
|
||||||
p_CB->state = READY;
|
p_CB->state = READY;
|
||||||
#ifdef __CMSIS_RTOS
|
#ifdef __CMSIS_RTOS
|
||||||
rt_ret_val2(p_CB, 0x08/*osEventSignal*/, p_CB->waits);
|
rt_ret_val2(p_CB, 0x08/*osEventSignal*/, p_CB->waits);
|
||||||
#else
|
#else
|
||||||
rt_ret_val (p_CB, OS_R_EVT);
|
rt_ret_val (p_CB, OS_R_EVT);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -86,7 +86,7 @@ __attribute__((always_inline)) static inline U32 __disable_irq(void)
|
||||||
__attribute__(( always_inline)) static inline U8 __clz(U32 value)
|
__attribute__(( always_inline)) static inline U8 __clz(U32 value)
|
||||||
{
|
{
|
||||||
U8 result;
|
U8 result;
|
||||||
|
|
||||||
__asm volatile ("clz %0, %1" : "=r" (result) : "r" (value));
|
__asm volatile ("clz %0, %1" : "=r" (result) : "r" (value));
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ static inline void __enable_irq(void)
|
||||||
static inline U32 __disable_irq(void)
|
static inline U32 __disable_irq(void)
|
||||||
{
|
{
|
||||||
U32 result;
|
U32 result;
|
||||||
|
|
||||||
__asm volatile ("mrs %0, primask" : "=r" (result));
|
__asm volatile ("mrs %0, primask" : "=r" (result));
|
||||||
__asm volatile ("cpsid i");
|
__asm volatile ("cpsid i");
|
||||||
return(result & 1);
|
return(result & 1);
|
||||||
|
@ -130,7 +130,7 @@ static inline U32 __disable_irq(void)
|
||||||
static inline U8 __clz(U32 value)
|
static inline U8 __clz(U32 value)
|
||||||
{
|
{
|
||||||
U8 result;
|
U8 result;
|
||||||
|
|
||||||
__asm volatile ("clz %0, %1" : "=r" (result) : "r" (value));
|
__asm volatile ("clz %0, %1" : "=r" (result) : "r" (value));
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ __inline static U32 rt_inc_qi (U32 size, U8 *count, U8 *first) {
|
||||||
*count = cnt+1;
|
*count = cnt+1;
|
||||||
c2 = (cnt = *first) + 1;
|
c2 = (cnt = *first) + 1;
|
||||||
if (c2 == size) c2 = 0;
|
if (c2 == size) c2 = 0;
|
||||||
*first = c2;
|
*first = c2;
|
||||||
}
|
}
|
||||||
__enable_irq ();
|
__enable_irq ();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -100,7 +100,7 @@ OS_RESULT rt_mbx_send (OS_ID mailbox, void *p_msg, U16 timeout) {
|
||||||
p_MCB->p_lnk = os_tsk.run;
|
p_MCB->p_lnk = os_tsk.run;
|
||||||
os_tsk.run->p_lnk = NULL;
|
os_tsk.run->p_lnk = NULL;
|
||||||
os_tsk.run->p_rlnk = (P_TCB)p_MCB;
|
os_tsk.run->p_rlnk = (P_TCB)p_MCB;
|
||||||
/* Task is waiting to send a message */
|
/* Task is waiting to send a message */
|
||||||
p_MCB->state = 2;
|
p_MCB->state = 2;
|
||||||
}
|
}
|
||||||
os_tsk.run->msg = p_msg;
|
os_tsk.run->msg = p_msg;
|
||||||
|
@ -163,7 +163,7 @@ OS_RESULT rt_mbx_wait (OS_ID mailbox, void **message, U16 timeout) {
|
||||||
p_MCB->p_lnk = os_tsk.run;
|
p_MCB->p_lnk = os_tsk.run;
|
||||||
os_tsk.run->p_lnk = NULL;
|
os_tsk.run->p_lnk = NULL;
|
||||||
os_tsk.run->p_rlnk = (P_TCB)p_MCB;
|
os_tsk.run->p_rlnk = (P_TCB)p_MCB;
|
||||||
/* Task is waiting to receive a message */
|
/* Task is waiting to receive a message */
|
||||||
p_MCB->state = 1;
|
p_MCB->state = 1;
|
||||||
}
|
}
|
||||||
rt_block(timeout, WAIT_MBX);
|
rt_block(timeout, WAIT_MBX);
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -54,7 +54,7 @@ int _init_box (void *box_mem, U32 box_size, U32 blk_size) {
|
||||||
|
|
||||||
/* Create memory structure. */
|
/* Create memory structure. */
|
||||||
if (blk_size & BOX_ALIGN_8) {
|
if (blk_size & BOX_ALIGN_8) {
|
||||||
/* Memory blocks 8-byte aligned. */
|
/* Memory blocks 8-byte aligned. */
|
||||||
blk_size = ((blk_size & ~BOX_ALIGN_8) + 7) & ~7;
|
blk_size = ((blk_size & ~BOX_ALIGN_8) + 7) & ~7;
|
||||||
sizeof_bm = (sizeof (struct OS_BM) + 7) & ~7;
|
sizeof_bm = (sizeof (struct OS_BM) + 7) & ~7;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -120,7 +120,7 @@ OS_RESULT rt_mut_release (OS_ID mutex) {
|
||||||
#ifdef __CMSIS_RTOS
|
#ifdef __CMSIS_RTOS
|
||||||
rt_ret_val(p_TCB, 0/*osOK*/);
|
rt_ret_val(p_TCB, 0/*osOK*/);
|
||||||
#else
|
#else
|
||||||
rt_ret_val(p_TCB, OS_R_MUT);
|
rt_ret_val(p_TCB, OS_R_MUT);
|
||||||
#endif
|
#endif
|
||||||
rt_rmv_dly (p_TCB);
|
rt_rmv_dly (p_TCB);
|
||||||
/* A waiting task becomes the owner of this mutex. */
|
/* A waiting task becomes the owner of this mutex. */
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -15,19 +15,19 @@
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
* documentation and/or other materials provided with the distribution.
|
* documentation and/or other materials provided with the distribution.
|
||||||
* - Neither the name of ARM nor the names of its contributors may be used
|
* - Neither the name of ARM nor the names of its contributors may be used
|
||||||
* to endorse or promote products derived from this software without
|
* to endorse or promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
@ -77,9 +77,9 @@ __RL_RTX_VER EQU 0x450
|
||||||
U32 rt_suspend (void) {
|
U32 rt_suspend (void) {
|
||||||
/* Suspend OS scheduler */
|
/* Suspend OS scheduler */
|
||||||
U32 delta = 0xFFFF;
|
U32 delta = 0xFFFF;
|
||||||
|
|
||||||
rt_tsk_lock();
|
rt_tsk_lock();
|
||||||
|
|
||||||
if (os_dly.p_dlnk) {
|
if (os_dly.p_dlnk) {
|
||||||
delta = os_dly.delta_time;
|
delta = os_dly.delta_time;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ U32 rt_suspend (void) {
|
||||||
if (os_tmr.tcnt < delta) delta = os_tmr.tcnt;
|
if (os_tmr.tcnt < delta) delta = os_tmr.tcnt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (delta);
|
return (delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ void rt_resume (U32 sleep_time) {
|
||||||
} else {
|
} else {
|
||||||
os_time += sleep_time;
|
os_time += sleep_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __CMSIS_RTOS
|
#ifndef __CMSIS_RTOS
|
||||||
/* Check the user timers. */
|
/* Check the user timers. */
|
||||||
if (os_tmr.next) {
|
if (os_tmr.next) {
|
||||||
|
@ -274,7 +274,7 @@ void rt_systick (void) {
|
||||||
#else
|
#else
|
||||||
rt_tmr_tick ();
|
rt_tmr_tick ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Switch back to highest ready task */
|
/* Switch back to highest ready task */
|
||||||
next = rt_get_first (&os_rdy);
|
next = rt_get_first (&os_rdy);
|
||||||
rt_switch_req (next);
|
rt_switch_req (next);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue