Webcam Server.
Dependencies: uvchost FatFileSystem mbed HTTPServer NetServicesMin
Revision 1:7a4f2c038803, committed 2012-08-14
- Comitter:
- va009039
- Date:
- Tue Aug 14 03:42:12 2012 +0000
- Parent:
- 0:2b4ea8a138e5
- Commit message:
- supported LogitechC270 and Safari
Changed in this revision
diff -r 2b4ea8a138e5 -r 7a4f2c038803 WebcamHandler.cpp --- a/WebcamHandler.cpp Wed Jun 06 11:47:06 2012 +0000 +++ b/WebcamHandler.cpp Tue Aug 14 03:42:12 2012 +0000 @@ -21,6 +21,7 @@ THE SOFTWARE. */ +#include "WebcamServerConfig.h" #include "WebcamHandler.h" //#define __DEBUG @@ -29,6 +30,20 @@ #define _D(...) #__VA_ARGS__ +#if CAM_COUNT == 1 +const char* html_index = _D( +<html> +<head> +<meta http-equiv="refresh" content="10"> +</head> +<body> +<a href="/cam.jpg"><img src="/cam.jpg" width="320" height="240"></a> +</body> +</html> +); +#endif + +#if CAM_COUNT == 2 const char* html_index = _D( <html> <head> @@ -40,6 +55,7 @@ </body> </html> ); +#endif #define CHUNK_SIZE 128 @@ -57,7 +73,7 @@ } DBG_ASSERT(cam >= 0); DBG_ASSERT(cam <= 1); - m_buf = m_image[cam].buf; + m_buf = (char*)m_image[cam].buf; m_buf_len = m_image[cam].len; respHeaders()["Content-Type"] = "image/jpeg"; m_busy = true; @@ -140,7 +156,7 @@ struct stimage WebcamHandler::m_image[] = {{NULL,0},{NULL,0}}; bool WebcamHandler::m_busy = false; -void WebcamHandler::setImage(char* buf, int len, int cam) +void WebcamHandler::setImage(uint8_t* buf, int len, int cam) { DBG_ASSERT(cam >= 0); DBG_ASSERT(cam <= 1);
diff -r 2b4ea8a138e5 -r 7a4f2c038803 WebcamHandler.h --- a/WebcamHandler.h Wed Jun 06 11:47:06 2012 +0000 +++ b/WebcamHandler.h Tue Aug 14 03:42:12 2012 +0000 @@ -28,7 +28,7 @@ #include "mbed.h" struct stimage { - char* buf; + uint8_t* buf; int len; }; @@ -37,7 +37,7 @@ public: WebcamHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket); virtual ~WebcamHandler(){} - static void setImage(char* buf, int len, int cam = 0); + static void setImage(uint8_t* buf, int len, int cam = 0); static bool busy() { return m_busy; } //protected: static inline HTTPRequestHandler* inst(const char* rootPath, const char* path, TCPSocket* pTCPSocket) { return new WebcamHandler(rootPath, path, pTCPSocket); } //if we ever could do static virtual functions, this would be one
diff -r 2b4ea8a138e5 -r 7a4f2c038803 WebcamInput.cpp --- a/WebcamInput.cpp Wed Jun 06 11:47:06 2012 +0000 +++ b/WebcamInput.cpp Tue Aug 14 03:42:12 2012 +0000 @@ -1,5 +1,7 @@ +#include "WebcamServerConfig.h" #include "WebcamInput.h" #include "WebcamHandler.h" +#include "myjpeg.h" //#define __DEBUG #include "mydbg.h" @@ -12,7 +14,8 @@ DBG("%p cam=%d\n", this, cam); m_t.reset(); m_t.start(); - m_image_buf = new char[IMAGE_SIZE]; + m_size = IMAGE_SIZE; + m_image_buf = new uint8_t[m_size]; DBG_ASSERT(m_image_buf); } @@ -52,6 +55,13 @@ m_image_buf[m_pos++] = data[i]; } if (buf[1]&0x02) { // EOF +#ifdef UVC_INSERT_DHT + myjpeg JPEG(m_image_buf, m_pos, m_size); + JPEG.analytics(); + if (JPEG.DHT_pos == 0) { + m_pos = JPEG.insertDHT(); + } +#endif // UVC_INSERT_DHT WebcamHandler::setImage(m_image_buf, m_pos, m_cam); m_t.reset(); m_seq = 0;
diff -r 2b4ea8a138e5 -r 7a4f2c038803 WebcamInput.h --- a/WebcamInput.h Wed Jun 06 11:47:06 2012 +0000 +++ b/WebcamInput.h Tue Aug 14 03:42:12 2012 +0000 @@ -12,7 +12,8 @@ int m_seq; uint8_t m_bfh; int m_pos; - char* m_image_buf; + int m_size; + uint8_t* m_image_buf; Timer m_t; int m_cam; };
diff -r 2b4ea8a138e5 -r 7a4f2c038803 WebcamServer.cpp --- a/WebcamServer.cpp Wed Jun 06 11:47:06 2012 +0000 +++ b/WebcamServer.cpp Tue Aug 14 03:42:12 2012 +0000 @@ -3,6 +3,7 @@ #include "EthernetNetIf.h" //#include "WIZ820ioNetIf.h" #include "HTTPServer.h" +#include "WebcamServerConfig.h" #include "WebcamHandler.h" #include "WebcamInput.h" Serial pc(USBTX, USBRX); @@ -12,12 +13,12 @@ EthernetNetIf eth; //WIZ820ioNetIf eth; -#define CAM_COUNT 2 uvc* Webcam[CAM_COUNT]; int main() { pc.baud(921600); + printf("%s\n", __FILE__); for(int i = 0; i < CAM_COUNT; i++) { uvc* cam = new uvc(i);
diff -r 2b4ea8a138e5 -r 7a4f2c038803 WebcamServerConfig.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebcamServerConfig.h Tue Aug 14 03:42:12 2012 +0000 @@ -0,0 +1,8 @@ +#ifndef WEBCAM_SERVER_CONFIG_H +#define WEBCAM_SERVER_CONFIG_H + +#define CAM_COUNT 1 + +#define UVC_INSERT_DHT + +#endif // WEBCAM_SERVER_CONFIG_H
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbBaseClass.cpp --- a/usb/UsbBaseClass.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -#include "UsbBaseClass.h" -//#define __DEBUG -#include "mydbg.h" - -UsbBaseClass::UsbBaseClass() -{ - if (m_pHost == NULL) { - m_pHost = new UsbHostMgr; - DBG_ASSERT(m_pHost); - m_pHost->init(); - } - DBG("m_pHost=%p\n", m_pHost); -} - -UsbErr UsbBaseClass::Usb_poll(int timeout, int timeout2) -{ - DBG("%p %d %d\n", this, timeout, timeout2); - Timer t; - t.reset(); - t.start(); - Timer t2; - t2.reset(); - t2.start(); - while(t.read_ms() < timeout) { - UsbErr rc = m_pHost->poll(); - if (rc == USBERR_PROCESSING) { - t2.reset(); - } - if (t2.read_ms() > timeout2) { - DBG("%p t=%d\n", this, t.read_ms()); - return USBERR_OK; - } - wait_ms(50); - } - return USBERR_PROCESSING; -} - -UsbHostMgr* UsbBaseClass::m_pHost = NULL;
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbBaseClass.h --- a/usb/UsbBaseClass.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#ifndef _USB_BASE_CLASS_H_ -#define _USB_BASE_CLASS_H_ -#include "UsbHostMgr.h" - -class UsbBaseClass { -public: - UsbBaseClass(); -protected: - UsbErr Usb_poll(int timeout = 15000, int timeout2 = 2000); - static UsbHostMgr* m_pHost; -}; - -#endif //_USB_BASE_CLASS_H_
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbDevice.cpp --- a/usb/UsbDevice.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,400 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#include "UsbDevice.h" -//#define __DEBUG -#include "mydbg.h" - -UsbDevice::UsbDevice( UsbHostMgr* pMgr, int hub, int port, int addr ) : m_pControlEp(NULL), /*m_controlEp( this, 0x00, false, USB_CONTROL, 8 ),*/ -m_pMgr(pMgr), m_connected(false), m_enumerated(false), m_hub(hub), m_port(port), m_addr(addr), m_refs(0), -m_vid(0), m_pid(0) -{ - m_DeviceClass = 0x00; - m_InterfaceClass = 0x00; -} - -UsbDevice::~UsbDevice() -{ - DBG_ASSERT(0); - - if(m_pControlEp) - delete m_pControlEp; -} - -UsbErr UsbDevice::enumerate() -{ - VERBOSE("Hub: %d Port: %d\n", m_hub, m_port); - UsbErr rc; - DBG("%p m_hub=%d m_port=%d\n", this, m_hub, m_port); - DBG_ASSERT(m_pMgr); - m_pMgr->resetPort(m_hub, m_port); - - wait_ms(400); - - uint8_t temp[8]; - DBG_ASSERT(m_pControlEp == NULL); - m_pControlEp = new UsbEndpoint( this, 0x00, false, USB_CONTROL, sizeof(temp), 0 ); - DBG_ASSERT(m_pControlEp); - //EDCtrl->Control = 8 << 16;/* Put max pkt size = 8 */ - /* Read first 8 bytes of device desc */ - DBG_ASSERT(sizeof(temp) >= 8); - //rc = controlReceive( - // USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, - // (USB_DESCRIPTOR_TYPE_DEVICE << 8) |(0), 0, temp, sizeof(temp)); - //DBG_ASSERT(rc == USBERR_OK); - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_DEVICE, 0, temp, sizeof(temp)); - if (rc != USBERR_OK) { - DBG("rc=%d\n", rc); - DBG_ASSERT(rc == USBERR_OK); - return rc; - } - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("DeviceDescriptor first 8 bytes", temp, sizeof(temp)); - DBG_ASSERT(temp[0] == 18); // bLength - DBG_ASSERT(temp[1] == 0x01); // bDescriptType - if (rc) - { - DBG("RC=%d",rc); - return (rc); - } - uint8_t bMaxPacketSize = temp[7]; - DBG_ASSERT(bMaxPacketSize >= 8); - DBG("Got descriptor, max ep size is %d\n", bMaxPacketSize); - - m_pControlEp->updateSize(bMaxPacketSize); /* Get max pkt size of endpoint 0 */ - rc = controlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS, m_addr, 0, NULL, 0); /* Set the device address to m_addr */ - DBG_ASSERT(rc == USBERR_OK); - if (rc) - { - // PRINT_Err(rc); - return (rc); - } - wait_ms(2); - //EDCtrl->Control = (EDCtrl->Control) | 1; /* Modify control pipe with address 1 */ - - //Update address - m_pControlEp->updateAddr(m_addr); - DBG("Ep addr is now %d", m_addr); - /**/ - - //rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_DEVICE, 0, TDBuffer, 17); //Read full device descriptor - //rc = controlReceive(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, - // (USB_DESCRIPTOR_TYPE_DEVICE << 8)|(0), 0, - // m_controlDataBuf, 17); - uint8_t DeviceDesc[18]; - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_DEVICE, 0, DeviceDesc, sizeof(DeviceDesc)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("DeviceDescriptor", DeviceDesc, sizeof(DeviceDesc)); - DBG_ASSERT(DeviceDesc[0] == 18); - DBG_ASSERT(DeviceDesc[1] == 0x01); - DBG_ASSERT(DeviceDesc[17] == 1); // bNumConfiguration - if (rc) - { - //PRINT_Err(rc); - return (rc); - } - - /* - rc = SerialCheckVidPid(); - if (rc != OK) { - PRINT_Err(rc); - return (rc); - } - */ - /**/ - m_DeviceClass = DeviceDesc[4]; - VERBOSE("DeviceClass: %02X\n", m_DeviceClass); - - m_vid = *((uint16_t*)&DeviceDesc[8]); - m_pid = *((uint16_t*)&DeviceDesc[10]); - VERBOSE("Vender: %04X\n", m_vid); - VERBOSE("Product: %04X\n", m_pid); - int iManufacture = DeviceDesc[14]; - if (iManufacture) { - char str[64]; - rc = GetString(iManufacture, str, sizeof(str)); - DBG_ASSERT(rc == USBERR_OK); - VERBOSE("Manufacture: %s\n", str); - } - int iProduct = DeviceDesc[15]; - if (iProduct) { - char str[64]; - rc = GetString(iProduct, str, sizeof(str)); - DBG_ASSERT(rc == USBERR_OK); - VERBOSE("Product: %s\n", str); - } - if (DeviceDesc[4] == 0x09) { // Hub - return hub_init(); - } - - uint8_t ConfigDesc[9]; - int index = 0; - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, ConfigDesc, sizeof(ConfigDesc)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("ConfigDescriptor 9bytes", ConfigDesc, sizeof(ConfigDesc)); - DBG_ASSERT(ConfigDesc[0] == 9); - DBG_ASSERT(ConfigDesc[1] == 0x02); - int wTotalLength = *((uint16_t*)&ConfigDesc[2]); - DBG("TotalLength: %d\n", wTotalLength); - int bConfigValue = ConfigDesc[5]; - DBG_ASSERT(bConfigValue == 1); - DBG("ConfigValue: %d\n", bConfigValue); - DBG("MaxPower: %d mA\n", ConfigDesc[8]*2); - - uint8_t* buf = new uint8_t[wTotalLength]; - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, buf, wTotalLength); - DBG_ASSERT(rc == USBERR_OK); - DBG_ASSERT(ConfigDesc[1] == 0x02); - int pos = 0; - while(pos < wTotalLength) { - DBG_BYTES("", buf+pos, buf[pos]); - if (buf[pos+1] == 4) { // interface ? - m_InterfaceClass = buf[pos+5]; - VERBOSE("InterfaceClass: %02X\n", m_InterfaceClass); - break; - } - pos += buf[pos]; - } - delete[] buf; - - rc = setConfiguration(1); - DBG_ASSERT(rc == USBERR_OK); - if (rc) - { - // PRINT_Err(rc); - return rc; - } - wait_ms(100);/* Some devices may require this delay */ - - m_enumerated = true; - return USBERR_OK; -} - -bool UsbDevice::connected() -{ - return m_connected; -} - -bool UsbDevice::enumerated() -{ - return m_enumerated; -} - -int UsbDevice::getPid() -{ - return m_pid; -} - -int UsbDevice::getVid() -{ - return m_vid; -} -#if 0 -UsbErr UsbDevice::getConfigurationDescriptor(int config, uint8_t** pBuf) -{ - DBG_ASSERT(m_controlDataBuf); - //For now olny one config - *pBuf = m_controlDataBuf; - return USBERR_OK; -} - -UsbErr UsbDevice::getInterfaceDescriptor(int config, int item, uint8_t** pBuf) -{ - DBG_ASSERT(m_controlDataBuf); - byte* desc_ptr = m_controlDataBuf; - -/* if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION) - { - return USBERR_BADCONFIG; - }*/ - DBG_ASSERT(m_controlDataBuf); - if(item>=m_controlDataBuf[4])//Interfaces count - return USBERR_NOTFOUND; - - desc_ptr += desc_ptr[0]; - - *pBuf = NULL; - - while (desc_ptr < m_controlDataBuf + *((uint16_t*)&m_controlDataBuf[2])) - { - - switch (desc_ptr[1]) { - case USB_DESCRIPTOR_TYPE_INTERFACE: - if(desc_ptr[2] == item) - { - *pBuf = desc_ptr; - return USBERR_OK; - } - desc_ptr += desc_ptr[0]; // Move to next descriptor start - break; - } - - } - - if(*pBuf == NULL) - return USBERR_NOTFOUND; - - return USBERR_OK; -} -#endif - -UsbErr UsbDevice::setConfiguration(int config) -{ - DBG("config=%d\n", config); - DBG_ASSERT(config == 1); - UsbErr rc = controlSend( - USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, // 0x00 - SET_CONFIGURATION, config, 0, 0, 0); - return rc; -} - -UsbErr UsbDevice::controlSend(byte requestType, byte request, word value, word index, const byte* buf, int len) -{ - UsbErr rc; - fillControlBuf(requestType, request, value, index, len); - DBG_ASSERT(m_pControlEp); - m_pControlEp->setNextToken(TD_SETUP); - rc = m_pControlEp->transfer(m_controlBuf, 8); - while(m_pControlEp->status() == USBERR_PROCESSING); - rc = (UsbErr) MIN(0, m_pControlEp->status()); - if(rc) - return rc; - if(len) - { - m_pControlEp->setNextToken(TD_OUT); - rc = m_pControlEp->transfer((byte*)buf, len); - while(m_pControlEp->status() == USBERR_PROCESSING); - rc = (UsbErr) MIN(0, m_pControlEp->status()); - if(rc) - return rc; - } - m_pControlEp->setNextToken(TD_IN); - rc = m_pControlEp->transfer(NULL, 0); - while(m_pControlEp->status() == USBERR_PROCESSING); - rc = (UsbErr) MIN(0, m_pControlEp->status()); - if(rc) - return rc; - return USBERR_OK; -} - -UsbErr UsbDevice::controlReceive(byte requestType, byte request, word value, word index, const byte* buf, int len) -{ - DBG("buf=%p len=%d\n", buf, len); - UsbErr rc; - fillControlBuf(requestType, request, value, index, len); - DBG_ASSERT(m_pControlEp); - m_pControlEp->setNextToken(TD_SETUP); - rc = m_pControlEp->transfer(m_controlBuf, 8); - while(m_pControlEp->status() == USBERR_PROCESSING); - rc = (UsbErr) MIN(0, m_pControlEp->status()); - if(rc) - return rc; - if(len) - { - m_pControlEp->setNextToken(TD_IN); - rc = m_pControlEp->transfer( (byte*) buf, len); - while(m_pControlEp->status() == USBERR_PROCESSING); - rc = (UsbErr) MIN(0, m_pControlEp->status()); - if(rc) - return rc; - } - m_pControlEp->setNextToken(TD_OUT); - rc = m_pControlEp->transfer(NULL, 0); - while(m_pControlEp->status() == USBERR_PROCESSING); - rc = (UsbErr) MIN(0, m_pControlEp->status()); - if(rc) - return rc; - return USBERR_OK; -} - -UsbErr UsbDevice::GetDescriptor(int type, int index, const byte* buf, int len) -{ - DBG("type=%02X\n", type); - return controlReceive( - USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, - (type << 8) |(index), 0, buf, len); - -} - -UsbErr UsbDevice::GetString(int index, char* buf, int len) -{ - DBG("index=%d buf=%p len=%d\n", index, buf, len); - DBG_ASSERT(index >= 1); - uint8_t temp[4]; - UsbErr rc; - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_STRING, 0, temp, sizeof(temp)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("LANG_ID", temp, sizeof(temp)); - DBG_ASSERT(temp[0] == 4); - DBG_ASSERT(temp[1] == 0x03); - - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_STRING, index, temp, 2); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("length check", temp, 2); - if (temp[0] == 0x00 && temp[1] == 0x00) { // for pl2303 - if (len > 0) { - strcpy(buf, ""); - } - return rc; - } - DBG_ASSERT(temp[1] == 0x03); - int temp_len = temp[0]; - - uint8_t* temp_buf = new uint8_t[temp_len]; - DBG_ASSERT(temp_buf); - rc = GetDescriptor(USB_DESCRIPTOR_TYPE_STRING, index, temp_buf, temp_len); - DBG_ASSERT(rc == USBERR_OK); - temp_len = temp_buf[0]; - DBG_HEX(temp_buf, temp_len); - int i = 0; - for(int pos = 2; pos < temp_len; pos+= 2) { - buf[i++] = temp_buf[pos]; - DBG_ASSERT(i < len-1); - } - buf[i] = '\0'; - delete[] temp_buf; - return rc; -} - -UsbErr UsbDevice::SetInterfaceAlternate(int interface, int alternate) -{ - UsbErr rc = controlSend( - USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, - SET_INTERFACE, alternate, interface, NULL, 0); - return rc; -} - -void UsbDevice::fillControlBuf(byte requestType, byte request, word value, word index, int len) -{ -#ifdef __BIG_ENDIAN - #error "Must implement BE to LE conv here" -#endif - m_controlBuf[0] = requestType; - m_controlBuf[1] = request; - //We are in LE so it's fine - *((word*)&m_controlBuf[2]) = value; - *((word*)&m_controlBuf[4]) = index; - *((word*)&m_controlBuf[6]) = (word) len; -} - -
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbDevice.h --- a/usb/UsbDevice.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef USB_DEVICE_H -#define USB_DEVICE_H - -#include "mbed.h" -#include "UsbInc.h" -#include "UsbEndpoint.h" -#include "UsbHostMgr.h" - -class UsbHostMgr; -class UsbEndpoint; - -class UsbDevice -{ -protected: - UsbDevice( UsbHostMgr* pMgr, int hub, int port, int addr ); - ~UsbDevice(); - - UsbErr enumerate(); - -public: - bool connected(); - bool enumerated(); - - int getPid(); - int getVid(); - - //UsbErr getConfigurationDescriptor(int config, uint8_t** pBuf); - //UsbErr getInterfaceDescriptor(int config, int item, uint8_t** pBuf); - - UsbErr setConfiguration(int config); - - UsbErr controlSend(byte requestType, byte request, word value, word index, const byte* buf, int len); - UsbErr controlReceive(byte requestType, byte request, word value, word index, const byte* buf, int len); - UsbErr GetDescriptor(int type, int index, const byte* buf, int len); - UsbErr GetString(int index, char* buf, int len); - UsbErr SetInterfaceAlternate(int interface, int alternate); - - uint8_t m_DeviceClass; - uint8_t m_InterfaceClass; - -protected: - void fillControlBuf(byte requestType, byte request, word value, word index, int len); -private: - friend class UsbEndpoint; - friend class UsbHostMgr; - - UsbEndpoint* m_pControlEp; - - UsbHostMgr* m_pMgr; - - bool m_connected; - bool m_enumerated; - - int m_hub; - int m_port; - int m_addr; - - int m_refs; - - uint16_t m_vid; - uint16_t m_pid; - - byte m_controlBuf[8];//8 - //byte m_controlDataBuf[/*128*/256]; - - UsbErr hub_init(); - UsbErr hub_poll(); - UsbErr hub_PortReset(int port); - UsbErr SetPortFeature(int feature, int index); - UsbErr ClearPortFeature(int feature, int index); - UsbErr SetPortReset(int port); - UsbErr GetPortStatus(int port, uint8_t* buf, int size); - int m_hub_ports; -}; - -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbDevice2.cpp --- a/usb/UsbDevice2.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -#include "UsbDevice.h" -//#define __DEBUG -#include "mydbg.h" - -#define PORT_RESET 4 -#define PORT_POWER 8 -#define C_PORT_CONNECTION 16 -#define C_PORT_RESET 20 - -UsbErr UsbDevice::hub_init() -{ - UsbErr rc; - uint8_t buf[9]; - rc = controlReceive( - USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, // 0xa0 - GET_DESCRIPTOR, - (USB_DESCRIPTOR_TYPE_HUB << 8), 0, buf, sizeof(buf)); - DBG_ASSERT(rc == USBERR_OK); - DBG_ASSERT(buf[0] == 9); - DBG_ASSERT(buf[1] == 0x29); - DBG_BYTES("HUB DESCRIPTOR", buf, sizeof(buf)); - - m_hub_ports = buf[2]; - VERBOSE("NbrPorts: %d\n", m_hub_ports); - int PwrOn2PwrGood = buf[5]; - VERBOSE("PwrOn2PwrGood: %d %d ms\n", PwrOn2PwrGood, PwrOn2PwrGood*2); - VERBOSE("HubContrCurrent: %d\n", buf[6]); - - rc = setConfiguration(1); - DBG_ASSERT(rc == USBERR_OK); - - uint8_t status[4]; - rc = controlReceive( - USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, // 0xa0 - GET_STATUS, - 0, 0, status, sizeof(status)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("HUB STATUS", status, sizeof(status)); - - for(int i = 1; i <= m_hub_ports; i++) { - rc = SetPortFeature(PORT_POWER, i); - DBG("PORT_POWER port=%d rc=%d\n", i, rc); - DBG_ASSERT(rc == USBERR_OK); - if (rc != USBERR_OK) { - return rc; - } - } - wait_ms(PwrOn2PwrGood*2); - - m_enumerated = true; - return USBERR_OK; -} - -UsbErr UsbDevice::hub_poll() -{ - DBG("%p m_hub=%d m_port=%d m_addr=%d\n", this, m_hub, m_port, m_addr); - // check status - for(int port = 1; port <= m_hub_ports; port++) { - uint8_t status[4]; - UsbErr rc = GetPortStatus(port, status, sizeof(status)); - DBG_ASSERT(rc == USBERR_OK); - DBG("port=%d\n", port); - DBG_BYTES("STATUS", status, sizeof(status)); - if (status[2] & 0x01) { // Connect Status Change, has changed - DBG_ASSERT(status[0] & 0x01); - ClearPortFeature(C_PORT_CONNECTION, port); - DBG_ASSERT(m_pMgr); - m_pMgr->onUsbDeviceConnected(m_addr, port); - return USBERR_PROCESSING; - } - } - return USBERR_OK; -} - -UsbErr UsbDevice::hub_PortReset(int port) -{ - DBG("%p port=%d\n", this, port); - DBG_ASSERT(port >= 1); - SetPortReset(port); - // wait reset - for(int i = 0; i < 100; i++) { - uint8_t status[4]; - UsbErr rc = GetPortStatus(port, status, sizeof(status)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("RESET", status, sizeof(status)); - if (status[2] & 0x10) { // Reset change , Reset complete - return USBERR_OK; - } - wait_ms(5); - } - return USBERR_ERROR; -} - -UsbErr UsbDevice::SetPortFeature(int feature, int index) -{ - //DBG("feature=%d index=%d\n", feature, index); - UsbErr rc; - rc = controlSend( - USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER, - SET_FEATURE, feature, index, 0, 0); - return rc; -} - -UsbErr UsbDevice::ClearPortFeature(int feature, int index) -{ - UsbErr rc; - rc = controlSend( - USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER, - CLEAR_FEATURE, feature, index, 0, 0); - return rc; -} - -UsbErr UsbDevice::SetPortReset(int port) -{ - //DBG("port=%d\n", port); - UsbErr rc = SetPortFeature(PORT_RESET, port); - DBG_ASSERT(rc == USBERR_OK); - return rc; -} - -UsbErr UsbDevice::GetPortStatus(int port, uint8_t* buf, int size) -{ - DBG_ASSERT(size == 4); - UsbErr rc; - //return USBControlTransfer(device, - //DEVICE_TO_HOST | REQUEST_TYPE_CLASS | RECIPIENT_OTHER, - //GET_STATUS,0,port,(u8*)status,4); - - rc = controlReceive( - USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_OTHER, - GET_STATUS, 0, port, buf, sizeof(buf)); - return rc; -} \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbEndpoint.cpp --- a/usb/UsbEndpoint.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,373 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#include "UsbEndpoint.h" -#include "UsbDevice.h" -#include "usb_mem.h" -#include "Usb_td.h" -#include "netCfg.h" -#if NET_USB - -//#define __DEBUG -//#define __DEBUG3 -//#include "dbg/dbg.h" -#include "mydbg.h" - -UsbEndpoint::UsbEndpoint( UsbDevice* pDevice, uint8_t ep, bool dir, UsbEndpointType type, uint16_t size, int addr /*= -1*/ ) -: m_pDevice(pDevice), m_result(true), m_status((int)USBERR_OK), m_len(0), m_pBufStartPtr(NULL), - m_pCbItem(NULL), m_pCbMeth(NULL) -{ - if (type == USB_ISO) { - UsbEndpoint_iso(pDevice, ep, dir, type, size, addr); - return; - } - - m_pEd = (volatile HCED*)usb_get_ed(); - DBG_ASSERT(m_pEd); - memset((void*)m_pEd, 0, sizeof(HCED)); - - m_pTdHead = (volatile HCTD*)usb_get_td((uint32_t)this); - DBG_ASSERT(m_pTdHead); - m_pTdTail = (volatile HCTD*)usb_get_td((uint32_t)this); - DBG_ASSERT(m_pTdTail); - DBG("m_pEd =%p\n", m_pEd); - DBG("m_pTdHead=%p\n", m_pTdHead); - DBG("m_pTdTail=%p\n", m_pTdTail); - - if(addr == -1) - addr = pDevice->m_addr; - - //Setup Ed - //printf("\r\n--Ep Setup--\r\n"); - m_pEd->Control = addr | /* USB address */ - ((ep & 0x7F) << 7) | /* Endpoint address */ - (type!=USB_CONTROL?((dir?2:1) << 11):0) | /* direction : Out = 1, 2 = In */ - (size << 16); /* MaxPkt Size */ - DBG3("m_pEd->Control=%08X\n", m_pEd->Control); - m_dir = dir; - m_setup = false; - m_type = type; - - m_pEd->TailTd = m_pEd->HeadTd = (uint32_t) m_pTdTail; //Empty TD list - - DBG("Before link\n"); - - //printf("\r\n--Ep Reg--\r\n"); - //Append Ed to Ed list - HCCA* hcca; - //volatile HCED* nextEd; - DBG("m_type=%d\n", m_type); - switch( m_type ) - { - case USB_CONTROL: - m_pEd->Next = LPC_USB->HcControlHeadED; - LPC_USB->HcControlHeadED = (uint32_t)m_pEd; - return; - - case USB_BULK: - m_pEd->Next = LPC_USB->HcBulkHeadED; - LPC_USB->HcBulkHeadED = (uint32_t)m_pEd; - return; - - case USB_INT: - hcca = (HCCA*)usb_get_hcca(); - m_pEd->Next = hcca->IntTable[0]; - hcca->IntTable[0] = (uint32_t)m_pEd; - return; - - default: - DBG_ASSERT(0); - } -} - - -UsbEndpoint::~UsbEndpoint() -{ - DBG_ASSERT(0); - - m_pEd->Control |= ED_SKIP; //Skip this Ep in queue - - //Remove from queue - volatile HCED* prevEd; - HCCA* hcca; - switch( m_type ) - { - case USB_CONTROL: - prevEd = (volatile HCED*) LPC_USB->HcControlHeadED; - break; - case USB_BULK: - prevEd = (volatile HCED*) LPC_USB->HcBulkHeadED; - break; - case USB_INT: - hcca = (HCCA*)usb_get_hcca(); - prevEd = (volatile HCED*)hcca->IntTable[0]; - break; - default: - DBG_ASSERT(0); - } - if( m_pEd == prevEd ) - { - switch( m_type ) - { - case USB_CONTROL: - LPC_USB->HcControlHeadED = m_pEd->Next; - break; - case USB_BULK: - LPC_USB->HcBulkHeadED = m_pEd->Next; - break; - case USB_INT: - hcca = (HCCA*)usb_get_hcca(); - hcca->IntTable[0] = m_pEd->Next; - break; - default: - DBG_ASSERT(0); - } - LPC_USB->HcBulkHeadED = m_pEd->Next; - } - else - { - while( prevEd->Next != (uint32_t) m_pEd ) - { - prevEd = (volatile HCED*) prevEd->Next; - } - prevEd->Next = m_pEd->Next; - } - - // - usb_free_ed((volatile byte*)m_pEd); - - usb_free_td((volatile byte*)m_pTdHead); - usb_free_td((volatile byte*)m_pTdTail); -} - -void UsbEndpoint::setNextToken(uint32_t token) //Only for control Eps -{ - switch(token) - { - case TD_SETUP: - m_dir = false; - m_setup = true; - break; - case TD_IN: - m_dir = true; - m_setup = false; - break; - case TD_OUT: - m_dir = false; - m_setup = false; - break; - } -} - -UsbErr UsbEndpoint::transfer(volatile uint8_t* buf, uint32_t len) -{ - DBG("buf=%p\n", buf); - if(!m_result) - return USBERR_BUSY; //The previous trasnfer is not completed - //FIXME: We should be able to queue the next transfer, still needs to be implemented - - if( !m_pDevice->connected() ) - return USBERR_DISCONNECTED; - - m_result = false; - - volatile uint32_t token = (m_setup?TD_SETUP:(m_dir?TD_IN:TD_OUT)); - - volatile uint32_t td_toggle; - if (m_type == USB_CONTROL) - { - if (m_setup) - { - td_toggle = TD_TOGGLE_0; - } - else - { - td_toggle = TD_TOGGLE_1; - } - } - else - { - td_toggle = 0; - } - - //Swap Tds - volatile HCTD* pTdSwap; - pTdSwap = m_pTdTail; - m_pTdTail = m_pTdHead; - m_pTdHead = pTdSwap; - - m_pTdHead->Control = (TD_ROUNDING | - token | - TD_DELAY_INT(0) |//7 - td_toggle | - TD_CC); - - m_pTdTail->Control = 0; - m_pTdHead->CurrBufPtr = (uint32_t) buf; - m_pBufStartPtr = buf; - m_pTdTail->CurrBufPtr = 0; - m_pTdHead->Next = (uint32_t) m_pTdTail; - m_pTdTail->Next = 0; - m_pTdHead->BufEnd = (uint32_t)(buf + (len - 1)); - m_pTdTail->BufEnd = 0; - - m_pEd->HeadTd = (uint32_t)m_pTdHead | ((m_pEd->HeadTd) & 0x00000002); //Carry bit - m_pEd->TailTd = (uint32_t)m_pTdTail; - - //DBG("m_pEd->HeadTd = %08x\n", m_pEd->HeadTd); - - if(m_type == USB_CONTROL) { - LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF; - LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_CLE; //Enable control list - } else if (m_type == USB_BULK) { //USB_BULK - LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF; - LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_BLE; //Enable bulk list - } else if (m_type == USB_INT) { // USB_INT - LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_PLE; //Enable Periodic - } else { // USB_ISO - DBG_ASSERT(0); - } - - //m_done = false; - m_len = len; - - return USBERR_PROCESSING; - -} - -int UsbEndpoint::status() -{ - if( !m_pDevice->connected() ) - { - if(!m_result) - onCompletion(); - m_result = true; - return (int)USBERR_DISCONNECTED; - } - else if( !m_result ) - { - return (int)USBERR_PROCESSING; - } - /*else if( m_done ) - { - return (int)USBERR_OK; - }*/ - else - { - return m_status; - } -} - -void UsbEndpoint::updateAddr(int addr) -{ - DBG("m_pEd->Control = %08x\n", m_pEd->Control); - m_pEd->Control &= ~0x7F; - m_pEd->Control |= addr; - DBG("m_pEd->Control = %08x\n", m_pEd->Control); -} - -void UsbEndpoint::updateSize(uint16_t size) -{ - DBG("m_pEd->Control = %08x\n", m_pEd->Control); - m_pEd->Control &= ~0x3FF0000; - m_pEd->Control |= (size << 16); - DBG("m_pEd->Control = %08x\n", m_pEd->Control); -} - -#if 0 //For doc only -template <class T> -void UsbEndpoint::setOnCompletion( T* pCbItem, void (T::*pCbMeth)() ) -{ - m_pCbItem = (CDummy*) pCbItem; - m_pCbMeth = (void (CDummy::*)()) pCbMeth; -} -#endif - -void UsbEndpoint::onCompletion() -{ - DBG_ASSERT(m_type != USB_ISO); - DBG_ASSERT(m_pTdHead); - //DBG("Transfer completed\n"); - if( m_pTdHead->Control >> 28 ) - { - DBG("TD Failed with condition code %01x\n", m_pTdHead->Control >> 28 ); - m_status = (int)USBERR_TDFAIL; - } - else if( m_pEd->HeadTd & 0x1 ) - { - m_pEd->HeadTd = m_pEd->HeadTd & ~0x1; - DBG("\r\nHALTED!!\r\n"); - m_status = (int)USBERR_HALTED; - } - else if( (m_pEd->HeadTd & ~0xF) == (uint32_t) m_pTdTail ) - { - //Done - int len; - DBG("m_pEp=%p\n", m_pEd); - DBG("m_pTdHead->CurrBufPtr=%08x\n", (uint32_t)m_pTdHead->CurrBufPtr); - DBG("m_pBufStartPtr=%08x\n", (uint32_t) m_pBufStartPtr); - if(m_pTdHead->CurrBufPtr) - len = m_pTdHead->CurrBufPtr - (uint32_t) m_pBufStartPtr; - else - len = m_len; - /*if(len == 0) //Packet transfered completely - len = m_len;*/ - //m_done = true; - DBG("Transfered %d bytes\n", len); - m_status = len; - } - else - { - DBG("Unknown error...\n"); - m_status = (int)USBERR_ERROR; - } - m_result = true; - if(m_pCbItem && m_pCbMeth) - (m_pCbItem->*m_pCbMeth)(); -} - - - -void UsbEndpoint::sOnCompletion(uint32_t pTd) -{ - HCTD* td = td_reverse((HCTD*)pTd); - while(td) { - HCTD* next = (HCTD*)td->Next; - HCUTD* utd = (HCUTD*)td; - UsbEndpoint* pEp = (UsbEndpoint*)utd->UsbEndpoint; - DBG_ASSERT(pEp); - if (usb_is_itd((byte*)td)) { - HCITD* itd = (HCITD*)td; - DBG_ASSERT(pEp->m_type == USB_ISO); - pEp->queue_done_itd.push(itd); - } else { - DBG_ASSERT(pEp->m_pTdHead == td); - if(pEp->m_pTdHead == td) { // found? - pEp->onCompletion(); - } - } - td = next; - } -} - -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbEndpoint.h --- a/usb/UsbEndpoint.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef USB_ENDPOINT_H -#define USB_ENDPOINT_H - -#include "mbed.h" -#include "UsbInc.h" -#include "Usb_td.h" - -class UsbDevice; - -enum UsbEndpointType -{ - USB_CONTROL, - USB_BULK, - USB_INT, - USB_ISO -}; - -class UsbEndpoint -{ -public: - UsbEndpoint( UsbDevice* pDevice, uint8_t ep, bool dir, UsbEndpointType type, uint16_t size, int addr = -1 ); - ~UsbEndpoint(); - void UsbEndpoint_iso(UsbDevice* pDevice, uint8_t ep, bool dir, UsbEndpointType type, uint16_t size, int addr); - - void setNextToken(uint32_t token); //Only for control Eps - - UsbErr transfer(volatile uint8_t* buf, uint32_t len); - UsbErr transfer(uint16_t frame, int count, volatile uint8_t* buf, int len); // for isochronous - int m_itdActive; - tdqueue <HCITD*> queue_done_itd; - int status(); //return UsbErr or transfered len - - void updateAddr(int addr); - void updateSize(uint16_t size); - - //void setOnCompletion( void(*pCb)completed() ); - class CDummy; - template <class T> - void setOnCompletion( T* pCbItem, void (T::*pCbMeth)() ) - { - m_pCbItem = (CDummy*) pCbItem; - m_pCbMeth = (void (CDummy::*)()) pCbMeth; - } - -//static void completed(){} - -protected: - void onCompletion(); -public: - static void sOnCompletion(uint32_t pTd); - -private: - friend class UsbDevice; - - UsbDevice* m_pDevice; - - bool m_dir; - bool m_setup; - UsbEndpointType m_type; - - //bool m_done; - volatile bool m_result; - volatile int m_status; - - volatile uint32_t m_len; - - volatile uint8_t* m_pBufStartPtr; - - volatile HCED* m_pEd; //Ep descriptor - - volatile HCTD* m_pTdHead; //Head trf descriptor - volatile HCTD* m_pTdTail; //Tail trf descriptor - - CDummy* m_pCbItem; - void (CDummy::*m_pCbMeth)(); -}; -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbEndpoint2.cpp --- a/usb/UsbEndpoint2.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -#include "UsbEndpoint.h" -#include "UsbDevice.h" -#include "usb_mem.h" - -//#define __DEBUG -//#define __DEBUG3 -//#include "dbg/dbg.h" -#include "mydbg.h" - -void UsbEndpoint::UsbEndpoint_iso(UsbDevice* pDevice, uint8_t ep, bool dir, UsbEndpointType type, uint16_t size, int addr) -{ - m_itdActive = 0; - m_pEd = (volatile HCED*)usb_get_ed(); - DBG_ASSERT(m_pEd); - memset((void*)m_pEd, 0, sizeof(HCED)); - - m_pTdHead = NULL; - m_pTdTail = NULL; - - volatile HCTD* itd = (volatile HCTD*)usb_get_itd((uint32_t)this); - DBG_ASSERT(itd); - memset((void*)itd, 0, sizeof(HCITD)); - DBG3("m_pEd =%p\n", m_pEd); - DBG3("itd =%p\n", itd); - - if(addr == -1) - addr = pDevice->m_addr; - - //Setup Ed - //printf("\r\n--Ep Setup--\r\n"); - m_pEd->Control = addr | /* USB address */ - ((ep & 0x7F) << 7) | /* Endpoint address */ - ((dir?2:1) << 11) | /* direction : Out = 1, 2 = In */ - (1 << 15) | /* F Format */ - (size << 16); /* MaxPkt Size */ - - DBG3("m_pEd->Control=%08X\n", m_pEd->Control); - - m_dir = dir; - m_setup = false; - m_type = type; - - m_pEd->TailTd = m_pEd->HeadTd = (uint32_t)itd; //Empty TD list - - DBG("Before link\n"); - - //printf("\r\n--Ep Reg--\r\n"); - //Append Ed to Ed list - HCCA* hcca = (HCCA*)usb_get_hcca(); - for(int i = 0; i < 32; i++) { - if (hcca->IntTable[i] == 0) { - hcca->IntTable[i] = (uint32_t)m_pEd; - } else { - volatile HCED* nextEd = (volatile HCED*)hcca->IntTable[i]; - while(nextEd->Next && nextEd->Next != (uint32_t)m_pEd) { - nextEd = (volatile HCED*)nextEd->Next; - } - nextEd->Next = (uint32_t)m_pEd; - } - } -} - -// for isochronous -UsbErr UsbEndpoint::transfer(uint16_t frame, int count, volatile uint8_t* buf, int len) -{ - DBG_ASSERT(count >= 1 && count <= 8); - DBG_ASSERT(buf); - DBG_ASSERT((len % count) == 0); - HCITD *itd = (HCITD*)m_pEd->TailTd; - DBG_ASSERT(itd); - HCITD *new_itd = (HCITD*)usb_get_itd((uint32_t)this); - DBG_ASSERT(new_itd); - if (itd == NULL) { - return USBERR_ERROR; - } - DBG("itd=%p\n", itd); - DBG2("new_itd=%p\n", new_itd); - int di = 0; //DelayInterrupt - itd->Control = 0xe0000000 | // CC ConditionCode NOT ACCESSED - ((count-1) << 24) | // FC FrameCount - TD_DELAY_INT(di) | // DI DelayInterrupt - frame; // SF StartingFrame - itd->BufferPage0 = (uint32_t)buf; - itd->BufferEnd = (uint32_t)buf+len-1; - itd->Next = (uint32_t)new_itd; - uint16_t offset[8]; - for(int i = 0; i < 8; i++) { - uint32_t addr = (uint32_t)buf + i*(len/count); - offset[i] = addr & 0x0fff; - if ((addr&0xfffff000) == (itd->BufferEnd&0xfffff000)) { - offset[i] |= 0x1000; - } - offset[i] |= 0xe000; - } - itd->OffsetPSW10 = (offset[1]<<16) | offset[0]; - itd->OffsetPSW32 = (offset[3]<<16) | offset[2]; - itd->OffsetPSW54 = (offset[5]<<16) | offset[4]; - itd->OffsetPSW76 = (offset[7]<<16) | offset[6]; - m_itdActive++; - DBG2("itd->Control =%08X\n", itd->Control); - DBG2("itd->BufferPage0=%08X\n", itd->BufferPage0); - DBG2("itd->Next =%08X\n", itd->Next); - DBG2("itd->BufferEnd =%08X\n", itd->BufferEnd); - DBG2("itd->OffsetPSW10=%08X\n", itd->OffsetPSW10); - DBG2("itd->OffsetPSW32=%08X\n", itd->OffsetPSW32); - DBG2("itd->OffsetPSW54=%08X\n", itd->OffsetPSW54); - DBG2("itd->OffsetPSW76=%08X\n", itd->OffsetPSW76); - m_pEd->TailTd = (uint32_t)new_itd; // start!!! - LPC_USB->HcControl |= OR_CONTROL_PLE; //Enable Periodic - return USBERR_PROCESSING; -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbHostMgr.cpp --- a/usb/UsbHostMgr.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,395 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -#include "UsbHostMgr.h" -#include "usb_mem.h" -#include "Usb_td.h" -#include "string.h" //For memcpy, memmove, memset -#include "netCfg.h" -#if NET_USB -//#define __DEBUG -//#define __DEBUG3 -//#include "dbg/dbg.h" -#include "mydbg.h" - -// bits of the USB/OTG clock control register -#define HOST_CLK_EN (1<<0) -#define DEV_CLK_EN (1<<1) -#define PORTSEL_CLK_EN (1<<3) -#define AHB_CLK_EN (1<<4) - -// bits of the USB/OTG clock status register -#define HOST_CLK_ON (1<<0) -#define DEV_CLK_ON (1<<1) -#define PORTSEL_CLK_ON (1<<3) -#define AHB_CLK_ON (1<<4) - -// we need host clock, OTG/portsel clock and AHB clock -#define CLOCK_MASK (HOST_CLK_EN | PORTSEL_CLK_EN | AHB_CLK_EN) - -static UsbHostMgr* pMgr = NULL; - -extern "C" void sUsbIrqhandler(void) __irq -{ - DBG("\n+Int\n"); - if(pMgr) - pMgr->UsbIrqhandler(); - DBG("\n-Int\n"); - return; -} - -UsbHostMgr::UsbHostMgr() : m_lpDevices() -{ - /*if(!pMgr)*/ //Assume singleton - pMgr = this; - usb_mem_init(); - for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) { - m_lpDevices[i] = NULL; - } - m_pHcca = (HCCA*) usb_get_hcca(); - memset((void*)m_pHcca, 0, 0x100); - m_hardware_init = false; - DBG("Host manager at %p\n", this); - - test_td(); // TD test program -} - -UsbHostMgr::~UsbHostMgr() -{ - if(pMgr == this) - pMgr = NULL; -} - -UsbErr UsbHostMgr::init() //Initialize host -{ - DBG("m_hardware_init=%d\n", m_hardware_init); - if(m_hardware_init) { - return USBERR_OK; - } - - NVIC_DisableIRQ(USB_IRQn); /* Disable the USB interrupt source */ - - LPC_SC->PCONP &= ~(1UL<<31); //Cut power - wait(1); - - - // turn on power for USB - LPC_SC->PCONP |= (1UL<<31); - // Enable USB host clock, port selection and AHB clock - LPC_USB->USBClkCtrl |= CLOCK_MASK; - // Wait for clocks to become available - while ((LPC_USB->USBClkSt & CLOCK_MASK) != CLOCK_MASK) - ; - - // it seems the bits[0:1] mean the following - // 0: U1=device, U2=host - // 1: U1=host, U2=host - // 2: reserved - // 3: U1=host, U2=device - // NB: this register is only available if OTG clock (aka "port select") is enabled!! - // since we don't care about port 2, set just bit 0 to 1 (U1=host) - LPC_USB->OTGStCtrl |= 1; - - // now that we've configured the ports, we can turn off the portsel clock - LPC_USB->USBClkCtrl &= ~PORTSEL_CLK_EN; - - // power pins are not connected on mbed, so we can skip them - /* P1[18] = USB_UP_LED, 01 */ - /* P1[19] = /USB_PPWR, 10 */ - /* P1[22] = USB_PWRD, 10 */ - /* P1[27] = /USB_OVRCR, 10 */ - /*LPC_PINCON->PINSEL3 &= ~((3<<4) | (3<<6) | (3<<12) | (3<<22)); - LPC_PINCON->PINSEL3 |= ((1<<4)|(2<<6) | (2<<12) | (2<<22)); // 0x00802080 - */ - - // configure USB D+/D- pins - /* P0[29] = USB_D+, 01 */ - /* P0[30] = USB_D-, 01 */ - LPC_PINCON->PINSEL1 &= ~((3<<26) | (3<<28)); - LPC_PINCON->PINSEL1 |= ((1<<26)|(1<<28)); // 0x14000000 - - DBG("Initializing Host Stack\n"); - - wait_ms(100); /* Wait 50 ms before apply reset */ - LPC_USB->HcControl = 0; /* HARDWARE RESET */ - LPC_USB->HcControlHeadED = 0; /* Initialize Control list head to Zero */ - LPC_USB->HcBulkHeadED = 0; /* Initialize Bulk list head to Zero */ - - /* SOFTWARE RESET */ - LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR; - LPC_USB->HcFmInterval = DEFAULT_FMINTERVAL; /* Write Fm Interval and Largest Data Packet Counter */ - LPC_USB->HcPeriodicStart = FI*90/100; - - /* Put HC in operational state */ - LPC_USB->HcControl = (LPC_USB->HcControl & (~OR_CONTROL_HCFS)) | OR_CONTROL_HC_OPER; - LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC; /* Set Global Power */ - - LPC_USB->HcHCCA = (uint32_t)(m_pHcca); - LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus; /* Clear Interrrupt Status */ - - - LPC_USB->HcInterruptEnable = OR_INTR_ENABLE_MIE | - OR_INTR_ENABLE_WDH | - OR_INTR_ENABLE_RHSC; - - NVIC_SetPriority(USB_IRQn, 0); /* highest priority */ - /* Enable the USB Interrupt */ - NVIC_SetVector(USB_IRQn, (uint32_t)(sUsbIrqhandler)); - LPC_USB->HcRhPortStatus1 = OR_RH_PORT_CSC; - LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; - - - /* Check for any connected devices */ - //if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) //Root device connected - //{ - // //Device connected - // wait(1); - // DBG("Device connected (%08x)\n", LPC_USB->HcRhPortStatus1); - // onUsbDeviceConnected(0, 1); //Hub 0 (root hub), Port 1 (count starts at 1) - //} - - DBG("Enabling IRQ\n"); - NVIC_EnableIRQ(USB_IRQn); - DBG("End of host stack initialization\n"); - m_hardware_init = true; - return USBERR_OK; -} - -UsbErr UsbHostMgr::poll() //Enumerate connected devices, etc -{ - /* Check for any connected devices */ - if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) //Root device connected - { - //Device connected - wait(1); - DBG("Device connected (%08x)\n", LPC_USB->HcRhPortStatus1); - onUsbDeviceConnected(0, 1); //Hub 0 (root hub), Port 1 (count starts at 1) - } - - for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) - { - UsbDevice* dev = m_lpDevices[i]; - if (dev == NULL) { - continue; - } - DBG3("%d dev=%p %d %d addr=%d\n", i, dev, dev->m_connected, dev->m_enumerated, dev->m_addr); - if(dev->m_connected) { - if (!dev->m_enumerated) { - dev->enumerate(); - return USBERR_PROCESSING; - } - } - } - for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) { - UsbDevice* dev = m_lpDevices[i]; - if (dev == NULL) { - continue; - } - if (dev->m_connected && dev->m_enumerated) { - if (dev->m_DeviceClass == 0x09) { // HUB - UsbErr rc = dev->hub_poll(); - if (rc == USBERR_PROCESSING) { - return USBERR_PROCESSING; - } - } - } - } - return USBERR_OK; -} - -int UsbHostMgr::devicesCount() -{ - int i; - for(i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) - { - if (m_lpDevices[i] == NULL) { - return i; - } - } - return i; -} - -UsbDevice* UsbHostMgr::getDevice(int item) -{ - UsbDevice* pDev = m_lpDevices[item]; - if(!pDev) - return NULL; - - pDev->m_refs++; - return pDev; -} - -void UsbHostMgr::releaseDevice(UsbDevice* pDev) -{ - DBG_ASSERT(0); - - pDev->m_refs--; - if(pDev->m_refs > 0) - return; - //If refs count = 0, delete - //Find & remove from list - int i; - for(i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) - { - if (m_lpDevices[i] == pDev) - break; - } - if(i!=USB_HOSTMGR_MAX_DEVS) - memmove(&m_lpDevices[i], &m_lpDevices[i+1], sizeof(UsbDevice*) * (USB_HOSTMGR_MAX_DEVS - (i + 1))); //Safer than memcpy because of overlapping mem - m_lpDevices[USB_HOSTMGR_MAX_DEVS - 1] = NULL; - delete pDev; -} - -void UsbHostMgr::UsbIrqhandler() -{ - uint32_t int_status; - uint32_t ie_status; - - int_status = LPC_USB->HcInterruptStatus; /* Read Interrupt Status */ - ie_status = LPC_USB->HcInterruptEnable; /* Read Interrupt enable status */ - - if (!(int_status & ie_status)) - { - return; - } - else - { - int_status = int_status & ie_status; - if (int_status & OR_INTR_STATUS_RHSC) /* Root hub status change interrupt */ - { - DBG("LPC_USB->HcRhPortStatus1 = %08x\n", LPC_USB->HcRhPortStatus1); - if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) - { - if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) - { - /* - * When DRWE is on, Connect Status Change - * means a remote wakeup event. - */ - //HOST_RhscIntr = 1;// JUST SOMETHING FOR A BREAKPOINT - } - else - { - /* - * When DRWE is off, Connect Status Change - * is NOT a remote wakeup event - */ - if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) //Root device connected - { - //Device connected - DBG("Device connected (%08x)\n", LPC_USB->HcRhPortStatus1); - onUsbDeviceConnected(0, 1); //Hub 0 (root hub), Port 1 (count starts at 1) - } - else //Root device disconnected - { - //Device disconnected - DBG("Device disconnected\n"); - onUsbDeviceDisconnected(0, 1); - } - //TODO: HUBS - } - LPC_USB->HcRhPortStatus1 = OR_RH_PORT_CSC; - } - if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRSC) - { - LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; - } - } - if (int_status & OR_INTR_STATUS_WDH) /* Writeback Done Head interrupt */ - { - //UsbEndpoint::sOnCompletion((LPC_USB->HccaDoneHead) & 0xFE); - if(m_pHcca->DoneHead) - { - UsbEndpoint::sOnCompletion(m_pHcca->DoneHead); - m_pHcca->DoneHead = 0; - LPC_USB->HcInterruptStatus = OR_INTR_STATUS_WDH; - if(m_pHcca->DoneHead) - DBG("??????????????????????????????\n\n\n"); - } - else - { - //Probably an error - int_status = LPC_USB->HcInterruptStatus; - DBG("HcInterruptStatus = %08x\n", int_status); - if (int_status & OR_INTR_STATUS_UE) //Unrecoverable error, disconnect devices and resume - { - onUsbDeviceDisconnected(0, 1); - LPC_USB->HcInterruptStatus = OR_INTR_STATUS_UE; - LPC_USB->HcCommandStatus = 0x01; //Host Controller Reset - } - } - } - LPC_USB->HcInterruptStatus = int_status; /* Clear interrupt status register */ - } - return; -} - -void UsbHostMgr::onUsbDeviceDisconnected(int hub, int port) -{ - for(int i = 0; i < devicesCount(); i++) - { - if( (m_lpDevices[i]->m_hub == hub) - && (m_lpDevices[i]->m_port == port) ) - { - m_lpDevices[i]->m_connected = false; - if(!m_lpDevices[i]->m_enumerated) - { - delete m_lpDevices[i]; - m_lpDevices[i] = NULL; - } - return; - } - } -} - -void UsbHostMgr::resetPort(int hub, int port) -{ - DBG3("hub=%d port=%d\n", hub, port); - if(hub == 0) //Root hub - { - wait_ms(100); /* USB 2.0 spec says at least 50ms delay before port reset */ - LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS; // Initiate port reset - DBG("Before loop\n"); - while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS) - ; - LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; // ...and clear port reset signal - DBG("After loop\n"); - wait_ms(200); /* Wait for 100 MS after port reset */ - } - else - { - for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) { - UsbDevice* dev = m_lpDevices[i]; - if (dev == NULL) { - continue; - } - if (dev->m_addr == hub) { - DBG("%d dev=%p\n", i, dev); - dev->hub_PortReset(port); - return; - } - } - DBG_ASSERT(0); - } -} - -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbHostMgr.h --- a/usb/UsbHostMgr.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -//Assigns addresses to connected devices... - -#ifndef USB_HOSTMGR_H -#define USB_HOSTMGR_H - -#include "mbed.h" -#include "UsbInc.h" -#include "UsbDevice.h" - -#define USB_HOSTMGR_MAX_DEVS 8 - -class UsbDevice; - -class UsbHostMgr //[0-2] inst -{ -public: - UsbHostMgr(); - ~UsbHostMgr(); - - UsbErr init(); //Initialize host - - UsbErr poll(); //Enumerate connected devices, etc - - int devicesCount(); - - UsbDevice* getDevice(int item); - UsbDevice* getDeviceByClass(uint8_t IfClass, int count = 0); - void releaseDevice(UsbDevice* pDev); - - - void UsbIrqhandler(); - -protected: - void onUsbDeviceConnected(int hub, int port); - void onUsbDeviceDisconnected(int hub, int port); - - friend class UsbDevice; - void resetPort(int hub, int port); - -private: -/* __align(8)*/ volatile HCCA* m_pHcca; - - UsbDevice* m_lpDevices[USB_HOSTMGR_MAX_DEVS]; - bool m_hardware_init; -}; - -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbHostMgr2.cpp --- a/usb/UsbHostMgr2.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -#include "UsbHostMgr.h" -//#define __DEBUG -#include "mydbg.h" - -UsbDevice* UsbHostMgr::getDeviceByClass(uint8_t IfClass, int count) -{ - DBG("IfClass=%02X count=%d\n", IfClass, count); - for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) { - UsbDevice* dev = m_lpDevices[i]; - if (dev) { - if(dev->m_connected && dev->m_enumerated) { - if (dev->m_InterfaceClass == IfClass) { // found - if (count-- <= 0) { - return dev; - } - } - } - } - } - return NULL; -} - -void UsbHostMgr::onUsbDeviceConnected(int hub, int port) -{ - DBG("%p hub=%d port=%d\n", this, hub, port); - for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) { - UsbDevice* dev = m_lpDevices[i]; - if (dev) { - if (dev->m_hub == hub && dev->m_port == port) { // skip - return; - } - } - } - - int item = devicesCount(); - DBG_ASSERT(item < USB_HOSTMGR_MAX_DEVS); - if( item == USB_HOSTMGR_MAX_DEVS ) - return; //List full... - //Find a free address (not optimized, but not really important) - int addr = 1; - for(int i = 0; i < item; i++) - { - DBG_ASSERT(m_lpDevices[i]); - addr = MAX( addr, m_lpDevices[i]->m_addr + 1 ); - } - DBG("item=%d addr=%d\n", item, addr); - UsbDevice* dev = new UsbDevice( this, hub, port, addr ); - DBG_ASSERT(dev); - dev->m_connected = true; - m_lpDevices[item] = dev; -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/UsbInc.h --- a/usb/UsbInc.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef USB_INC_H -#define USB_INC_H - -#include "mbed.h" - -#define MIN(a,b) ((a)<(b)?(a):(b)) -#define MAX(a,b) ((a)>(b)?(a):(b)) - -//typedef int32_t RC; - -typedef uint8_t byte; -typedef uint16_t word; - -enum UsbErr -{ - __USBERR_MIN = -0xFFFF, - USBERR_DISCONNECTED, - USBERR_NOTFOUND, - USBERR_BADCONFIG, - USBERR_PROCESSING, - USBERR_HALTED, //Transfer on an ep is stalled - USBERR_BUSY, - USBERR_TDFAIL, - USBERR_ERROR, - USBERR_OK = 0 -}; - - -/* From NXP's USBHostLite stack's usbhost_lpc17xx.h */ -/* Only the types names have been changed to avoid unecessary typedefs */ - - -/* -************************************************************************************************************** -* NXP USB Host Stack -* -* (c) Copyright 2008, NXP SemiConductors -* (c) Copyright 2008, OnChip Technologies LLC -* All Rights Reserved -* -* www.nxp.com -* www.onchiptech.com -* -* File : usbhost_lpc17xx.h -* Programmer(s) : Ravikanth.P -* Version : -* -************************************************************************************************************** -*/ - - - -/* -************************************************************************************************************** -* OHCI OPERATIONAL REGISTER FIELD DEFINITIONS -************************************************************************************************************** -*/ - - /* ------------------ HcControl Register --------------------- */ -#define OR_CONTROL_PLE 0x00000004 -#define OR_CONTROL_IE 0x00000008 -#define OR_CONTROL_CLE 0x00000010 -#define OR_CONTROL_BLE 0x00000020 -#define OR_CONTROL_HCFS 0x000000C0 -#define OR_CONTROL_HC_OPER 0x00000080 - /* ----------------- HcCommandStatus Register ----------------- */ -#define OR_CMD_STATUS_HCR 0x00000001 -#define OR_CMD_STATUS_CLF 0x00000002 -#define OR_CMD_STATUS_BLF 0x00000004 - /* --------------- HcInterruptStatus Register ----------------- */ -#define OR_INTR_STATUS_WDH 0x00000002 -#define OR_INTR_STATUS_RHSC 0x00000040 -#define OR_INTR_STATUS_UE 0x00000010 - /* --------------- HcInterruptEnable Register ----------------- */ -#define OR_INTR_ENABLE_WDH 0x00000002 -#define OR_INTR_ENABLE_RHSC 0x00000040 -#define OR_INTR_ENABLE_MIE 0x80000000 - /* ---------------- HcRhDescriptorA Register ------------------ */ -#define OR_RH_STATUS_LPSC 0x00010000 -#define OR_RH_STATUS_DRWE 0x00008000 - /* -------------- HcRhPortStatus[1:NDP] Register -------------- */ -#define OR_RH_PORT_CCS 0x00000001 -#define OR_RH_PORT_PRS 0x00000010 -#define OR_RH_PORT_CSC 0x00010000 -#define OR_RH_PORT_PRSC 0x00100000 - - -/* -************************************************************************************************************** -* FRAME INTERVAL -************************************************************************************************************** -*/ - -#define FI 0x2EDF /* 12000 bits per frame (-1) */ -#define DEFAULT_FMINTERVAL ((((6 * (FI - 210)) / 7) << 16) | FI) - -/* -************************************************************************************************************** -* ENDPOINT DESCRIPTOR CONTROL FIELDS -************************************************************************************************************** -*/ - -#define ED_SKIP (uint32_t) (0x00001000) /* Skip this ep in queue */ - -/* -************************************************************************************************************** -* TRANSFER DESCRIPTOR CONTROL FIELDS -************************************************************************************************************** -*/ - -#define TD_ROUNDING (uint32_t) (0x00040000) /* Buffer Rounding */ -#define TD_SETUP (uint32_t)(0) /* Direction of Setup Packet */ -#define TD_IN (uint32_t)(0x00100000) /* Direction In */ -#define TD_OUT (uint32_t)(0x00080000) /* Direction Out */ -#define TD_DELAY_INT(x) (uint32_t)((x) << 21) /* Delay Interrupt */ -#define TD_TOGGLE_0 (uint32_t)(0x02000000) /* Toggle 0 */ -#define TD_TOGGLE_1 (uint32_t)(0x03000000) /* Toggle 1 */ -#define TD_CC (uint32_t)(0xF0000000) /* Completion Code */ - -#define ITD_SF (uint32_t)(0x0000FFFF) /* Starting Frame */ -#define ITD_FC (uint32_t)(0x07000000) /* FrameCount */ - -/* -************************************************************************************************************** -* USB STANDARD REQUEST DEFINITIONS -************************************************************************************************************** -*/ - -#define USB_DESCRIPTOR_TYPE_DEVICE 1 -#define USB_DESCRIPTOR_TYPE_CONFIGURATION 2 -#define USB_DESCRIPTOR_TYPE_STRING 3 -#define USB_DESCRIPTOR_TYPE_INTERFACE 4 -#define USB_DESCRIPTOR_TYPE_ENDPOINT 5 -#define USB_DESCRIPTOR_TYPE_HUB 0x29 - /* ----------- Control RequestType Fields ----------- */ -#define USB_DEVICE_TO_HOST 0x80 -#define USB_HOST_TO_DEVICE 0x00 -#define USB_REQUEST_TYPE_CLASS 0x20 -#define USB_RECIPIENT_DEVICE 0x00 -#define USB_RECIPIENT_INTERFACE 0x01 -#define USB_RECIPIENT_OTHER 0x03 - - /* -------------- USB Standard Requests -------------- */ -#define GET_STATUS 0 -#define CLEAR_FEATURE 1 -#define SET_FEATURE 3 -#define SET_ADDRESS 5 -#define GET_DESCRIPTOR 6 -#define SET_CONFIGURATION 9 -#define SET_INTERFACE 11 - -/* -************************************************************************************************************** -* TYPE DEFINITIONS -************************************************************************************************************** -*/ - -typedef struct hcEd { /* ----------- HostController EndPoint Descriptor ------------- */ - volatile uint32_t Control; /* Endpoint descriptor control */ - volatile uint32_t TailTd; /* Physical address of tail in Transfer descriptor list */ - volatile uint32_t HeadTd; /* Physcial address of head in Transfer descriptor list */ - volatile uint32_t Next; /* Physical address of next Endpoint descriptor */ -} HCED; - -typedef struct hcTd { /* ------------ HostController Transfer Descriptor ------------ */ - volatile uint32_t Control; /* Transfer descriptor control */ - volatile uint32_t CurrBufPtr; /* Physical address of current buffer pointer */ - volatile uint32_t Next; /* Physical pointer to next Transfer Descriptor */ - volatile uint32_t BufEnd; /* Physical address of end of buffer */ -} HCTD; - -typedef struct hcItd { // HostController Isochronous Transfer Descriptor - volatile uint32_t Control; // Transfer descriptor control - volatile uint32_t BufferPage0; // Buffer Page 0 - volatile uint32_t Next; // Physical pointer to next Transfer Descriptor - volatile uint32_t BufferEnd; // buffer End - volatile uint32_t OffsetPSW10; // Offset1/PSW1 Offset0/PSW0 - volatile uint32_t OffsetPSW32; // Offset3/PSW3 Offset2/PSW2 - volatile uint32_t OffsetPSW54; // Offset5/PSW5 Offset4/PSW4 - volatile uint32_t OffsetPSW76; // Offset7/PSW7 Offset6/PSW6 -} HCITD; - -typedef struct hcUtd { - union { - HCTD hctd; - HCITD hcitd; - }; - volatile uint32_t type; // 1:TD, 2:ITD - volatile uint32_t UsbEndpoint; - volatile uint32_t reserve1; - volatile uint32_t reserve2; -} HCUTD; - -typedef struct hcca { /* ----------- Host Controller Communication Area ------------ */ - volatile uint32_t IntTable[32]; /* Interrupt Table */ - volatile uint32_t FrameNumber; /* Frame Number */ - volatile uint32_t DoneHead; /* Done Head */ - volatile uint8_t Reserved[116]; /* Reserved for future use */ - volatile uint8_t Unknown[4]; /* Unused */ -} HCCA; - - - -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/Usb_td.cpp --- a/usb/Usb_td.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,240 +0,0 @@ -#include "mbed.h" -#include "Usb_td.h" -//#define __DEBUG -#include "mydbg.h" - -#define __TEST - -#ifdef __TEST -#include <queue> -#endif - -template class tdqueue<HCTD*>; -template class tdqueue<HCITD*>; - -HCTD* td_reverse(HCTD* td) -{ - HCTD* result = NULL; - HCTD* next; - while(td) { - next = (HCTD*)td->Next; - td->Next = (uint32_t)result; - result = td; - td = next; - } - return result; -} - -template <class T> -tdqueue<T>::tdqueue():m_head(NULL),m_tail(NULL) -{ - -} - -template <class T> -int tdqueue<T>::size() -{ - int n = 0; - T td = m_head; - while(td) { - td = (T)td->Next; - n++; - } - return n; -} - -template <class T> -bool tdqueue<T>::empty() -{ - return (m_head == NULL); -} - -template <class T> -T tdqueue<T>::front() -{ - return m_head; -} - -template <class T> -void tdqueue<T>::pop() -{ - T td = m_head; - if (td) { - m_head = (T)td->Next; - } - if (td == m_tail) { - m_tail = NULL; - } -} - -template <class T> -void tdqueue<T>::push(T td) -{ - td->Next = NULL; - if (m_tail) { - m_tail->Next = (uint32_t)td; - } - m_tail = td; - if (m_head == NULL) { - m_head = td; - } -} - -#ifdef __TEST -static void test_td_list() -{ - tdqueue<HCTD*> list; - HCTD* td1; - HCTD* td2; - HCTD* td3; - HCTD* td4; - // 0 - DBG_ASSERT(list.size() == 0); - td1 = list.front(); - DBG_ASSERT(td1 == NULL); - list.pop(); - td1 = list.front(); - DBG_ASSERT(td1 == NULL); - // 1 - td1 = (HCTD*)usb_get_td(1); - list.push(td1); - DBG_ASSERT(list.size() == 1); - td2 = list.front(); - DBG_ASSERT(td2 == td1); - list.pop(); - td2 = list.front(); - DBG_ASSERT(td2 == NULL); - DBG_ASSERT(list.size() == 0); - usb_free_td((byte*)td1); - // 2 - td1 = (HCTD*)usb_get_td(1); - td2 = (HCTD*)usb_get_td(2); - list.push(td1); - list.push(td2); - DBG_ASSERT(list.size() == 2); - td3 = list.front(); - DBG_ASSERT(td3 == td1); - list.pop(); - td3 = list.front(); - DBG_ASSERT(td3 == td2); - list.pop(); - td3 = list.front(); - DBG_ASSERT(td3 == NULL); - usb_free_td((byte*)td1); - usb_free_td((byte*)td2); - // 3 - td1 = (HCTD*)usb_get_td(1); - td2 = (HCTD*)usb_get_td(2); - td3 = (HCTD*)usb_get_td(3); - list.push(td1); - list.push(td2); - list.push(td3); - DBG_ASSERT(list.size() == 3); - td4 = list.front(); - DBG_ASSERT(td4 == td1); - list.pop(); - td4 = list.front(); - DBG_ASSERT(td4 == td2); - list.pop(); - td4 = list.front(); - DBG_ASSERT(td4 == td3); - list.pop(); - td4 = list.front(); - DBG_ASSERT(td4 == NULL); - usb_free_td((byte*)td1); - usb_free_td((byte*)td2); - usb_free_td((byte*)td3); - // n - queue<HCTD*> queue; - for(int n = 1; n <= 10; n++) { - DBG_ASSERT(list.size() == queue.size()); - DBG_ASSERT(list.empty() == queue.empty()); - if (list.empty() || (rand()%10) > 5) { - td1 = (HCTD*)usb_get_td(n); - if (td1) { - list.push(td1); - queue.push(td1); - } - //DBG("+ %d %p\n", n, td1); - } else { - td1 = list.front(); - td2 = queue.front(); - if (td1 != td2) { - //DBG("td1=%p td2=%p\n", td1, td2); - } - DBG_ASSERT(td1 == td2); - if (td1) { - list.pop(); - queue.pop(); - usb_free_td((byte*)td1); - } - //DBG("- %d %p\n", n, td1); - } - } - while(!list.empty()) { - td1 = list.front(); - list.pop(); - usb_free_td((byte*)td1); - } - //DBG_ASSERT(0); -} - -static void test_td_reverse() -{ - - HCTD* td1; - HCTD* td2; - HCTD* td3; - HCTD* td4; - // 0 - td1 = NULL; - td2 = td_reverse(td1); - DBG_ASSERT(td2 == NULL); - // 1 - td1 = (HCTD*)usb_get_td(1); - DBG_ASSERT(td1); - DBG_ASSERT(td1->Next == NULL); - td2 = td_reverse(td1); - DBG_ASSERT(td2 == td1); - DBG_ASSERT(td2->Next == NULL); - usb_free_td((byte*)td1); - // 2 - td1 = (HCTD*)usb_get_td(1); - DBG_ASSERT(td1); - td2 = (HCTD*)usb_get_td(2); - DBG_ASSERT(td2); - td1->Next = (uint32_t)td2; - td3 = td_reverse(td1); - DBG_ASSERT(td3 == td2); - DBG_ASSERT(td3->Next == (uint32_t)td1); - DBG_ASSERT(td1->Next == NULL); - usb_free_td((byte*)td1); - usb_free_td((byte*)td2); - // 3 - td1 = (HCTD*)usb_get_td(1); - td2 = (HCTD*)usb_get_td(2); - td3 = (HCTD*)usb_get_td(3); - td1->Next = (uint32_t)td2; - td2->Next = (uint32_t)td3; - td4 = td_reverse(td1); - DBG_ASSERT(td4 == td3); - DBG_ASSERT(td3->Next == (uint32_t)td2); - DBG_ASSERT(td2->Next == (uint32_t)td1); - DBG_ASSERT(td1->Next == NULL); - usb_free_td((byte*)td1); - usb_free_td((byte*)td2); - usb_free_td((byte*)td3); -} - -void test_td() -{ - test_td_reverse(); - test_td_list(); - DBG("Usb_td.cpp TD test done.\n"); -} -#else //__TEST -void test_td() -{ - -} -#endif //__TEST \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/Usb_td.h --- a/usb/Usb_td.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -#ifndef USB_TD_H -#define USB_TD_H -#include "UsbInc.h" -#include "usb_mem.h" - -template <class T> -class tdqueue { -public: - tdqueue(); - int size(); - bool empty(); - T front(); - void pop(); - void push(T td); -private: - T m_head; - T m_tail; -}; - -HCTD* td_reverse(HCTD* td); -void test_td(); - -#endif //USB_TD_H
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/mydbg.h --- a/usb/mydbg.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -#ifndef _MYDBG_H_ -#define _MYDBG_H_ -#ifdef __DEBUG -#include "Utils.h" -#define DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);} while(0); -#define DBG2(...) do{fprintf(stderr,"[%d] ",__LINE__);fprintf(stderr,__VA_ARGS__);} while(0); -#define DBG_BYTES(A,B,C) do{printf("[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);printfBytes(A,B,C);}while(0); -#define DBG_HEX(A,B) do{printf("[%s@%d]\n",__PRETTY_FUNCTION__,__LINE__);printHex(A,B);}while(0); -#define DBG_LED4(A) led4.write(A) -#define DBG_PRINTF(...) do{fprintf(stderr,__VA_ARGS__);} while(0); -#else //__DEBUG -#define DBG(...) while(0); -#define DBG2(...) while(0); -#define DBG_BYTES(A,B,C) while(0); -#define DBG_HEX(A,B) while(0); -#define DBG_LED4(A) while(0); -#define DBG_PRINTF(...) while(0); -#endif //__DEBUG -#ifdef __DEBUG3 -#define DBG3(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);} while(0); - -#else //__DEBUG3 -#define DBG3(...) while(0); -#endif //__DEBUG3 - -#ifndef __NODEBUG -#define DBG_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; -#else -#define DBG_ASSERT(A) while(0); -#endif - -#define VERBOSE(...) do{printf(__VA_ARGS__);} while(0); - -#endif //_MYDBG_H_
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/netCfg.h --- a/usb/netCfg.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -#ifndef NET_CFG_H -#define NET_GPRS 1 -#define NET_PPP 1 -#define NET_GPRS_MODULE 1 -#define NET_ETH 1 -#define NET_USB_SERIAL 1 -#define NET_CFG_H 1 -#define NET_UMTS 1 -#define NET_USB 1 -#define NET_LWIP_STACK 1 -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/usb_mem.c --- a/usb/usb_mem.c Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,260 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -#include "mbed.h" -//#define __DEBUG -#include "mydbg.h" -#include "usb_mem.h" -#include "string.h" //For memcpy, memmove, memset -//#include "netCfg.h" -#include "UsbInc.h" - -//#if NET_USB - -#define EDS_COUNT 16 -#define TDS_COUNT 0 -#define ITDS_COUNT 0 -#define UTDS_COUNT 32 -#define BPS_COUNT 8 - -#define HCCA_SIZE 0x100 -#define ED_SIZE 0x10 -#define TD_SIZE 0x10 -#define ITD_SIZE 0x20 -#define UTD_SIZE (32+16) -#define BP_SIZE (128*8) - -#define TOTAL_SIZE (HCCA_SIZE + (EDS_COUNT*ED_SIZE) + (TDS_COUNT*TD_SIZE) + (ITDS_COUNT*ITD_SIZE)) - -static volatile __align(256) byte usb_buf[TOTAL_SIZE] __attribute((section("AHBSRAM0"),aligned)); //256 bytes aligned! -static volatile __align(32) uint8_t usb_utdBuf[UTDS_COUNT*UTD_SIZE] __attribute((section("AHBSRAM0"),aligned)); - -static volatile byte* usb_hcca; //256 bytes aligned! - -static volatile byte* usb_edBuf; //4 bytes aligned! - -static byte usb_edBufAlloc[EDS_COUNT] __attribute((section("AHBSRAM0"),aligned)); -static uint8_t usb_utdBufAlloc[UTDS_COUNT] __attribute((section("AHBSRAM0"),aligned)); -static uint8_t usb_bpBufAlloc[BPS_COUNT] __attribute((section("AHBSRAM0"),aligned)); -static uint8_t usb_bpBuf[BP_SIZE*BPS_COUNT] __attribute((section("AHBSRAM0"),aligned)); - -static void utd_init() -{ - DBG_ASSERT(sizeof(HCTD) == 16); - DBG_ASSERT(sizeof(HCITD) == 32); - DBG_ASSERT(sizeof(HCUTD) == 48); - - DBG_ASSERT(((uint32_t)usb_utdBuf % 16) == 0); - DBG_ASSERT(((uint32_t)usb_utdBuf % 32) == 0); - - DBG_ASSERT((uint32_t)usb_utdBufAlloc >= 0x2007c000); - DBG_ASSERT((uint32_t)&usb_utdBufAlloc[UTDS_COUNT] <= 0x2007ffff); - - DBG_ASSERT((uint32_t)usb_utdBuf >= 0x2007c000); - DBG_ASSERT((uint32_t)&usb_utdBuf[UTD_SIZE*UTDS_COUNT] <= 0x2007cfff); - - memset(usb_utdBufAlloc, 0x00, UTDS_COUNT); -} - -static void pb_init() -{ - memset(usb_bpBufAlloc, 0x00, BPS_COUNT); - - DBG_ASSERT((uint32_t)usb_bpBufAlloc >= 0x2007c000); - DBG_ASSERT((uint32_t)&usb_bpBufAlloc[BPS_COUNT] <= 0x2007ffff); - DBG_ASSERT((uint32_t)usb_bpBuf >= 0x2007c000); - DBG_ASSERT((uint32_t)(&usb_bpBuf[BP_SIZE*BPS_COUNT]) <= 0x2007ffff); -} - -void usb_mem_init() -{ - usb_hcca = usb_buf; - usb_edBuf = usb_buf + HCCA_SIZE; - memset(usb_edBufAlloc, 0, EDS_COUNT); - - utd_init(); - pb_init(); - - DBG("--- Memory Map --- \n"); - DBG("usb_hcca =%p\n", usb_hcca); - DBG("usb_edBuf =%p\n", usb_edBuf); - DBG("usb_utdBuf =%p\n", usb_utdBuf); - DBG("usb_edBufAlloc =%p\n", usb_edBufAlloc); - DBG("usb_utdBufAlloc=%p\n", usb_utdBufAlloc); - DBG("usb_bpBufAlloc =%p\n", usb_bpBufAlloc); - DBG("usb_bpBuf =%p\n", usb_bpBuf); - DBG(" =%p\n", &usb_bpBuf[BP_SIZE*BPS_COUNT]); - DBG_ASSERT(((uint32_t)usb_hcca % 256) == 0); - DBG_ASSERT(((uint32_t)usb_edBuf % 16) == 0); - DBG_ASSERT(((uint32_t)usb_utdBuf % 32) == 0); -} - -volatile byte* usb_get_hcca() -{ - return usb_hcca; -} - -volatile byte* usb_get_ed() -{ - int i; - for(i = 0; i < EDS_COUNT; i++) - { - if( !usb_edBufAlloc[i] ) - { - usb_edBufAlloc[i] = 1; - return usb_edBuf + i*ED_SIZE; - } - } - return NULL; //Could not alloc ED -} - -static uint8_t* usb_get_utd(int al) -{ - DBG_ASSERT(al == 16 || al == 32); // GTD or ITD - if (al == 16) { - for(int i = 1; i < UTDS_COUNT; i += 2) { - if (usb_utdBufAlloc[i] == 0) { - uint32_t p = (uint32_t)usb_utdBuf + i * UTD_SIZE; - if ((p % al) == 0) { - usb_utdBufAlloc[i] = 1; - DBG_ASSERT((p % al) == 0); - return (uint8_t*)p; - } - } - } - } - for(int i = 0; i < UTDS_COUNT; i++) { - if (usb_utdBufAlloc[i] == 0) { - uint32_t p = (uint32_t)usb_utdBuf + i * UTD_SIZE; - if ((p % al) == 0) { - usb_utdBufAlloc[i] = 1; - DBG_ASSERT((p % al) == 0); - return (uint8_t*)p; - } - } - } - return NULL; -} - -volatile byte* usb_get_td(uint32_t endpoint) -{ - DBG_ASSERT(endpoint); - uint8_t* td = usb_get_utd(16); - if (td) { - HCUTD* utd = (HCUTD*)td; - memset(utd, 0x00, sizeof(HCTD)); - utd->type = 1; - utd->UsbEndpoint = endpoint; - } - return td; -} - -volatile byte* usb_get_itd(uint32_t endpoint) -{ - DBG_ASSERT(endpoint); - uint8_t* itd = usb_get_utd(32); - if (itd) { - HCUTD* utd = (HCUTD*)itd; - memset(utd, 0x00, sizeof(HCITD)); - utd->type = 2; - utd->UsbEndpoint = endpoint; - } - return itd; -} - -volatile byte* usb_get_bp(int size) -{ - DBG_ASSERT(size >= 128 && size <= BP_SIZE); - if (size > BP_SIZE) { - return NULL; - } - for(int i = 0; i < BPS_COUNT; i++) - { - if( !usb_bpBufAlloc[i] ) - { - usb_bpBufAlloc[i] = 1; - return usb_bpBuf + i*BP_SIZE; - } - } - return NULL; //Could not alloc Buffer Page -} - -int usb_bp_size() -{ - return BP_SIZE; -} - -void usb_free_ed(volatile byte* ed) -{ - int i; - i = (ed - usb_edBuf) / ED_SIZE; - usb_edBufAlloc[i] = 0; -} - -static void usb_free_utd(volatile uint8_t* utd) -{ - DBG_ASSERT(utd >= usb_utdBuf); - DBG_ASSERT(utd <= (usb_utdBuf+UTD_SIZE*(UTDS_COUNT-1))); - DBG_ASSERT(((uint32_t)utd % 16) == 0); - int i = (utd - usb_utdBuf) / UTD_SIZE; - DBG_ASSERT(usb_utdBufAlloc[i] == 1); - usb_utdBufAlloc[i] = 0; -} - -void usb_free_td(volatile byte* td) -{ - usb_free_utd(td); - return; -} - -void usb_free_itd(volatile byte* itd) -{ - usb_free_utd(itd); - return; -} - -void usb_free_bp(volatile byte* bp) -{ - DBG_ASSERT(bp >= usb_bpBuf); - int i; - i = (bp - usb_bpBuf) / BP_SIZE; - DBG_ASSERT(usb_bpBufAlloc[i] == 1); - usb_bpBufAlloc[i] = 0; -} - -bool usb_is_td(volatile byte* td) -{ - DBG_ASSERT(td); - HCUTD* utd = (HCUTD*)td; - DBG_ASSERT(utd->type != 0); - return utd->type == 1; -} - -bool usb_is_itd(volatile byte* itd) -{ - DBG_ASSERT(itd); - HCUTD* utd = (HCUTD*)itd; - DBG_ASSERT(utd->type != 0); - return utd->type == 2; -} - -//#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 usb/usb_mem.h --- a/usb/usb_mem.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef USB_MEM_H -#define USB_MEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef unsigned char byte; - -void usb_mem_init(); - -volatile byte* usb_get_hcca(); - -volatile byte* usb_get_ed(); - -volatile byte* usb_get_td(uint32_t endpoint); -volatile byte* usb_get_itd(uint32_t endpoint); - -volatile byte* usb_get_bp(int size); -int usb_bp_size(); - -void usb_free_ed(volatile byte* ed); - -void usb_free_td(volatile byte* td); - -void usb_free_itd(volatile byte* itd); - -void usb_free_bp(volatile byte* bp); - -bool usb_is_td(volatile byte* td); -bool usb_is_itd(volatile byte* td); - -#ifdef __cplusplus -} -#endif - -#endif
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/Utils.cpp --- a/uvc/Utils.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ - - -#include "mbed.h" -#include "Utils.h" - -void printfBytes(const char* s, const u8* data, int len) -{ - printf("%s %d:",s,len); - if (len > 256) - len = 256; - while (len-- > 0) - printf(" %02X",*data++); - printf("\n"); -} - -void printHexLine(const u8* d, int addr, int len) -{ - printf("%04X ",addr); - int i; - for (i = 0; i < len; i++) - printf("%02X ",d[i]); - for (;i < 16; i++) - printf(" "); - char s[16+1]; - memset(s,0,sizeof(s)); - for (i = 0; i < len; i++) - { - int c = d[i]; - if (c < 0x20 || c > 0x7E) - c = '.'; - s[i] = c; - } - printf("%s\n",s); -} - -void printHex(const u8* d, int len) -{ - int addr = 0; - while (len) - { - int count = len; - if (count > 16) - count = 16; - printHexLine(d+addr,addr,count); - addr += 16; - len -= count; - } -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/Utils.h --- a/uvc/Utils.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; - -//void DelayMS(int ms); - -void printfBytes(const char* label,const u8* data, int len); -void printHex(const u8* d, int len); - -#ifndef min -#define min(_a,_b) ((_a) < (_b) ? (_a) : (_b)) -#endif - -inline int LE16(const u8* d) -{ - return d[0] | (d[1] << 8); -} - - -inline int LE24(const uint8_t* d) { - return d[0] | (d[1]<<8) | (d[2] << 16); -} - -inline int LE32(const uint8_t* d) { - return d[0] |(d[1]<<8) | (d[2] << 16) |(d[3] << 24) ; -} - -inline u32 BE32(const u8* d) -{ - return (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3]; -} - -inline void BE32(u32 n, u8* d) -{ - d[0] = (u8)(n >> 24); - d[1] = (u8)(n >> 16); - d[2] = (u8)(n >> 8); - d[3] = (u8)n; -} - -inline void BE16(u32 n, u8* d) -{ - d[0] = (u8)(n >> 8); - d[1] = (u8)n; -} -#endif //UTILS_H \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/myjpeg.cpp --- a/uvc/myjpeg.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,252 +0,0 @@ -#include "mbed.h" -//#define __DEBUG -#include "mydbg.h" -#include "myjpeg.h" - -static const uint8_t dht[] = { -0xFF,0xC4,0x01,0xA2,0x00,0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A, -0x0B,0x01,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x10,0x00, -0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D,0x01, -0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22, -0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,0xB1,0xC1,0x15,0x52,0xD1,0xF0,0x24, -0x33,0x62,0x72,0x82,0x09,0x0A,0x16,0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28,0x29, -0x2A,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A, -0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A, -0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A, -0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8, -0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3,0xC4,0xC5,0xC6, -0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE1,0xE2,0xE3, -0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9, -0xFA,0x11,0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01, -0x02,0x77,0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07, -0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,0xC1,0x09,0x23,0x33, -0x52,0xF0,0x15,0x62,0x72,0xD1,0x0A,0x16,0x24,0x34,0xE1,0x25,0xF1,0x17,0x18,0x19, -0x1A,0x26,0x27,0x28,0x29,0x2A,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46, -0x47,0x48,0x49,0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66, -0x67,0x68,0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x82,0x83,0x84,0x85, -0x86,0x87,0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3, -0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA, -0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8, -0xD9,0xDA,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF2,0xF3,0xF4,0xF5,0xF6, -0xF7,0xF8,0xF9,0xFA, -}; - -myjpeg::myjpeg(uint8_t* buf, int len, int capacity) -{ - DBG_ASSERT(buf); - DBG_ASSERT(len >= 0); - m_buf = buf; - m_len = len; - m_capacity = capacity; -} - -int myjpeg::getc() -{ - if (m_pos >= m_len) { - return -1; - } - return m_buf[m_pos++]; -} - -int myjpeg::getBE16() -{ - int c1 = getc(); - if (c1 == (-1)) { - return -1; - } - int c2 = getc(); - if (c2 == (-1)) { - return -1; - } - return c1<<8|c2; -} - -void myjpeg::analytics() -{ - m_pos = 0; - SOS_pos = 0; - DHT_pos = 0; - int skip; - int lp; - while(1) { - int marker_pos = m_pos; - int c = getc(); - if (c == (-1)) { - break; - } - if (c != 0xff) { - continue; - } - c = getc(); - if (c == (-1)) { - break; - } - uint8_t marker = c; - switch(marker) { - case 0xd8: - DBG("%04X SOI\n", marker_pos); - skip = 0; - break; - case 0xd9: - DBG("%04X EOI\n", marker_pos); - skip = 0; - break; - case 0x00: - skip = 0; - break; - case 0xc0: - lp = getBE16(); - DBG("%04X SOF0 %d\n", marker_pos, lp); - skip = lp - 2; - break; - case 0xc4: - lp = getBE16(); - DBG("%04X DHT Lh: %d\n", marker_pos, lp); - //DBG("Tc: %d\n", buf[pos+2]>>4); - //DBG("Th: %d\n", buf[pos+2]&0xf); - DHT_pos = marker_pos; - skip = lp - 2; - break; - case 0xda: - lp = getBE16(); - DBG("%04X SOS Ls: %d\n", marker_pos, lp); - //DBG("Ns: %d\n", buf[pos+2]); - //for(i = 1; i <= buf[pos+2]; i++) { - // DBG("Cs%d: %d\n", i, buf[pos+3+(i-1)*2]); - // DBG("Td%d: %d\n", i, buf[pos+4+(i-1)*2]>>4); - // DBG("Ta%d: %d\n", i, buf[pos+4+(i-1)*2]&0xf); - //} - SOS_pos = marker_pos; - skip = lp - 2; - break; - case 0xdb: - lp = getBE16(); - DBG("%04X DQT %d\n", marker_pos, lp); - skip = lp - 2; - break; - case 0xe0: - lp = getBE16(); - DBG("%04X APP0 %d\n", marker_pos, lp); - skip = lp - 2; - break; - default: - DBG("%04X ??? %02X\n", marker_pos, marker); - skip = 0; - break; - } - while(skip-- > 0) { - getc(); - } - } -} - -int myjpeg::insertDHT() -{ - DBG("m_len=%d m_capacity=%d SOS=%d\n", m_len, m_capacity, SOS_pos); - DBG_ASSERT(SOS_pos > 0); - DBG_ASSERT(SOS_pos < m_len); - DBG_ASSERT(m_len <= m_capacity); - DBG_ASSERT(sizeof(dht) == 420); - - int num1 = m_len - SOS_pos; - if (num1 > (m_capacity - SOS_pos - sizeof(dht))) { - num1 = m_capacity - SOS_pos - sizeof(dht); - } - DBG("num1=%d\n", num1); - DBG_ASSERT(SOS_pos+sizeof(dht)+num1 <= m_capacity); - memmove(m_buf+SOS_pos+sizeof(dht), m_buf+SOS_pos, num1); - - int num2 = sizeof(dht); - if (num2 > m_capacity - SOS_pos) { - num2 = m_capacity - SOS_pos; - } - DBG("num2=%d\n", num2); - DBG_ASSERT(SOS_pos+num2 <= m_capacity); - memcpy(m_buf+SOS_pos, dht, num2); - m_len += sizeof(dht); - if (m_len > m_capacity) { - m_len = m_capacity; - } - return m_len; -} - -int fgetBE16(FILE* fp) -{ - int c1 = fgetc(fp); - if (c1 == EOF) { - return -1; - } - int c2 = fgetc(fp); - if (c2 == EOF) { - return -1; - } - return c1<<8|c2; -} - -void QcamCopy(const char* destination, const char* source) -{ - FILE* fp; - FILE* fp2; - fp = fopen(source, "rb"); - if (fp == NULL) { - return; - } - fp2 = fopen(destination, "wb"); - if (fp2 == NULL) { - return; - } - int i,c1,c2; - bool f_dht = false; - bool f_lp = false; - while(!feof(fp)){ - c1 = fgetc(fp); - if (c1 != 0xff) { - fputc(c1, fp2); - continue; - } - c2 = fgetc(fp); - switch(c2) { - case 0xda: // SOS - if (!f_dht) { - for(i = 0; i < sizeof(dht); i++) { - fputc(dht[i], fp2); - } - f_dht = true; - } - f_lp = true; - break; - case 0xc4: // DHT - f_dht = true; - f_lp = true; - break; - case 0xc0: - case 0xdb: - case 0xe0: - f_lp = true; - break; - default: - f_lp = false; - break; - } - fputc(c1, fp2); - fputc(c2, fp2); // marker - if (f_lp) { - c1 = fgetc(fp); // length - c2 = fgetc(fp); - fputc(c1, fp2); - fputc(c2, fp2); - int skip = c1<<8|c2; - while(skip-- > 2) { - int c = fgetc(fp); - if (c == EOF) { - break; - } - fputc(c, fp2); - } - } - } - fclose(fp); - fclose(fp2); -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/myjpeg.h --- a/uvc/myjpeg.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -#ifndef MYJPEG_H -#define MYJPEG_H -class myjpeg { -public: - myjpeg(uint8_t* buf, int len, int capacity); - void analytics(); - int insertDHT(); - int SOS_pos; - int DHT_pos; -private: - int getc(); - int getBE16(); - uint8_t* m_buf; - int m_len; - int m_pos; - int m_capacity; -}; - -void QcamCopy(const char* destination, const char* source); - -#endif //MYJPEG_H \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/stcamcfg.h --- a/uvc/stcamcfg.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#ifndef STCAMCFG_H -#define STCAMCFG_H -struct stcamcfg { - uint16_t idVender; - uint16_t idProduct; - uint16_t width; - uint16_t height; - uint8_t payload; - uint8_t bEndpointAddress; - uint16_t wMaxPacketSize; - uint8_t FormatIndex; - uint8_t FrameIndex; - uint32_t dwFrameInterval; - uint8_t bInterface; - uint8_t bAlternate; - char *name; - int iso_FrameCount; - int iso_itdCount; - // work area - int _If; - int _Ifalt; - int _IfClass; - int _IfSubClass; -}; -#endif //STCAMCFG_H \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/usb_itd.cpp --- a/uvc/usb_itd.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -#include "mbed.h" -#include "usb_itd.h" -#define __DEBUG -#include "mydbg.h" - -usb_itd::usb_itd(HCITD* itd) -{ - DBG_ASSERT(itd); - m_itd = itd; -} - -bool usb_itd::Done() -{ - int cc = (m_itd->Control >> 28); - if (cc == 0xe || cc == 0xf) { // not accessed? - return false; - } - if (m_itd->Next) { - return false; - } - return true; -} - -int usb_itd::ConditionCode() -{ - int cc = (m_itd->Control >> 28); - return cc; -} - -uint16_t usb_itd::get_psw(int n) -{ - DBG_ASSERT(n >= 0 && n <= 7); - DBG_ASSERT(m_itd); - uint16_t psw = 0; - switch(n) { - case 0: psw = m_itd->OffsetPSW10; break; - case 1: psw = m_itd->OffsetPSW10 >> 16; break; - case 2: psw = m_itd->OffsetPSW32; break; - case 3: psw = m_itd->OffsetPSW32 >> 16; break; - case 4: psw = m_itd->OffsetPSW54; break; - case 5: psw = m_itd->OffsetPSW54 >> 16; break; - case 6: psw = m_itd->OffsetPSW76; break; - case 7: psw = m_itd->OffsetPSW76 >> 16; break; - } - return psw; -} - -uint16_t usb_itd::StartingFrame() -{ - return (m_itd->Control & ITD_SF); -} - -int usb_itd::FrameCount() -{ - DBG_ASSERT(m_itd); - int fc = ((m_itd->Control & ITD_FC) >> 24) + 1; - DBG_ASSERT(fc >= 1 && fc <= 8); - return fc; -} - -int usb_itd::PacketStatus(int n) -{ - DBG_ASSERT(n >=0 && n <= 7); - uint16_t psw = get_psw(n); - int cc = (psw >> 12) & 0xf; - return cc; -} - -int usb_itd::Length(int n) -{ - DBG_ASSERT(n >=0 && n <= 7); - uint16_t psw = get_psw(n); - int size = psw & 0x7ff; - int cc = (psw >> 12) & 0xf; - if (cc == 0xe || cc == 0xf) { - return -1; - } - if (cc == 0 || cc == 9) { - return size; - } - debug(); - return -1; -} - -uint8_t* usb_itd::BufferPage(int n, int size) -{ - DBG_ASSERT(n >=0 && n <= 7); - DBG_ASSERT(size >= 128 && size <= 956); - uint8_t* buf = (uint8_t*)m_itd->BufferPage0 + n * size; - DBG_ASSERT((uint32_t)(buf+size-1) <= m_itd->BufferEnd); - return buf; -} - -void usb_itd::free() -{ - DBG_ASSERT(m_itd); - if (m_itd) { - uint8_t* buf = (uint8_t*)m_itd->BufferPage0; - DBG_ASSERT(buf); - usb_free_bp(buf); - usb_free_itd((byte*)m_itd); - m_itd = NULL; - } -} - -void usb_itd::debug() -{ - DBG("itd =%08X\n", m_itd); - DBG("itd->Control =%08X\n", m_itd->Control); - DBG("itd->BufferPage0=%08X\n", m_itd->BufferPage0); - DBG("itd->Next =%08X\n", m_itd->Next); - DBG("itd->BufferEnd =%08X\n", m_itd->BufferEnd); - DBG("itd->OffsetPSW10=%08X\n", m_itd->OffsetPSW10); - DBG("itd->OffsetPSW32=%08X\n", m_itd->OffsetPSW32); - DBG("itd->OffsetPSW54=%08X\n", m_itd->OffsetPSW54); - DBG("itd->OffsetPSW76=%08X\n", m_itd->OffsetPSW76); -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/usb_itd.h --- a/uvc/usb_itd.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -#ifndef USB_ITD_H -#define USB_ITD_H -#include "UsbInc.h" -#include "usb_mem.h" - -class usb_itd { -public: - usb_itd(HCITD* itd); - bool Done(); - int ConditionCode(); - int FrameCount(); - int PacketStatus(int n); - int Length(int n); - uint8_t* BufferPage(int n, int size); - uint16_t StartingFrame(); - void free(); - void debug(); -private: - uint16_t get_psw(int n); - HCITD* m_itd; -}; - -#endif //USB_ITD_H \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/usb_mjpeg.cpp --- a/uvc/usb_mjpeg.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -#include "mbed.h" -#include "usb_mjpeg.h" -//#define __DEBUG -#define __DEBUG2 -#include "mydbg.h" -#include "Utils.h" -#include "myjpeg.h" - -#ifdef __DEBUG -extern DigitalOut led4; -#endif // __DEBUG - -#define MJPEG_FID 0x01 -#define MJPEG_EOF 0x02 -#define MJPEG_PTS 0x04 -#define MJPEG_SCR 0x08 -#define MJPEG_STI 0x20 -#define MJPEG_ERR 0x40 -#define MJPEG_EOH 0x80 - - -usb_mjpeg::usb_mjpeg(uint8_t* buf, int size) -{ - DBG_ASSERT(size >= 1024 && size <= 16000); - m_size = size; - m_seq = 0; - m_buf = buf; - ReportErrorFID = 0; - ReportErrorPTS = 0; -} - -usb_mjpeg::~usb_mjpeg() -{ - -} - -void usb_mjpeg::input(uint16_t frame, uint8_t* buf, int len) -{ - uint8_t* StreamHeader = buf; - DBG_ASSERT(buf); - if (len > 12) { - //DBG_PRINTF("%d %02X %d\n", frame, buf[1], len); - //DBG_HEX(buf, len); - DBG_ASSERT(StreamHeader[0] == 0x0c); - //DBG_ASSERT(buf[1] == 0x8c || buf[1] == 0x8d); - //DBG("bfh:%02X\n", buf[1]); - } - DBG_ASSERT(len >= 2); - - int hle = StreamHeader[0]; - uint8_t bfh = StreamHeader[1]; - DBG_ASSERT(len >= hle); - DBG_ASSERT(hle == 12); - uint8_t* data = buf + hle; - int data_len = len - hle; - if (m_seq == 0) { - if (check_SOI(buf, len)) { - DBG_PRINTF("%04X SOI\n", frame); - DBG_BYTES("SOI", buf, 16); - _open(); - m_bfh = bfh; // save FID - if (bfh & MJPEG_PTS) { - m_pts = LE32(StreamHeader+2); // save PTS - } - _wrtie(data, data_len); - m_seq++; - } - } else if (m_seq == 1) { - if (len > hle) { - _wrtie(data, data_len); - } - if (check_EOI(buf, len)) { - DBG_PRINTF("%04X EOI\n", frame); - DBG_BYTES("EOI", buf, 12); - _close(); - m_seq = 2; // done - } else if ((m_bfh ^ bfh) & MJPEG_FID) { - ReportErrorFID++; - DBG("ReportErrorFID=%d\n", ReportErrorFID); - m_seq = 0; // restart - } else if ((bfh & MJPEG_PTS) && m_pts != LE32(StreamHeader+2)) { - ReportErrorPTS++; - DBG("ReportErrorPTS=%d\n", ReportErrorPTS); - m_seq = 0; // restart - } - } else { // done - } - DBG_LED4(buf[1] & MJPEG_FID); // FID -} - -int usb_mjpeg::status() -{ - if (m_seq <= 1) { - return USBERR_PROCESSING; - } - return m_pos; -} - -bool usb_mjpeg::check_SOI(uint8_t* buf, int len) -{ - if (len >= (12+2)) { - if (buf[12] == 0xff && buf[13] == 0xd8) { - return true; - } - } - return false; -} - -bool usb_mjpeg::check_EOI(uint8_t* buf, int len) -{ - if (len >= 12) { - if (buf[1] & MJPEG_EOF) { - return true; - } - } - return false; -} - -void usb_mjpeg::_open() -{ - m_pos = 0; -} - -void usb_mjpeg::_wrtie(uint8_t* buf, int len) -{ - if (m_buf == NULL) { - return; - } - for(int i = 0; i < len && m_pos < m_size; i++) { - m_buf[m_pos++] = buf[i]; - } -} - -void usb_mjpeg::_close() -{ - //DBG("m_pos=%d\n", m_pos); - //DBG_HEX(m_buf, m_pos); - myjpeg JPEG(m_buf, m_pos, m_size); - JPEG.analytics(); - if (JPEG.DHT_pos == 0) { - m_pos = JPEG.insertDHT(); - } -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/usb_mjpeg.h --- a/uvc/usb_mjpeg.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -#ifndef USB_MJPEG_H -#define USB_MJPEG_H -#include "UsbInc.h" - -class usb_stream { -public: - virtual void input(uint16_t frame, uint8_t* buf, int len) = 0; -}; - -class usb_mjpeg : public usb_stream { -public: - usb_mjpeg(uint8_t* buf = NULL, int size = 4800); - ~usb_mjpeg(); - virtual void input(uint16_t frame, uint8_t* buf, int len); - int status(); - uint16_t ReportErrorFID; - uint16_t ReportErrorPTS; -private: - void _open(); - void _wrtie(uint8_t* buf, int len); - void _close(); - - uint8_t* m_buf; - int m_pos; - bool check_SOI(uint8_t* buf, int len); - bool check_EOI(uint8_t* buf, int len); - void analyticsJPEG(uint8_t* buf, int len); - int m_seq; - int m_size; - uint8_t m_bfh; - uint32_t m_pts; -}; -#endif //USB_MJPEG_H \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/uvc.cpp --- a/uvc/uvc.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,264 +0,0 @@ -#include "mbed.h" -#include "uvc.h" - -//#define __DEBUG -//#define __DEBUG3 -#include "mydbg.h" -#include "usb_itd.h" - -uvc::uvc(int cam) -{ - DBG("cam=%d\n", cam); - DBG_ASSERT(cam >= 0); - m_cam = cam; - m_init = false; - m_connect = false; - m_int_seq = 0; - m_iso_seq = 0; - m_width = 0; - m_height = 0; - m_payload = PAYLOAD_MJPEG; - m_FormatIndex = 0; - m_FrameIndex = 0; - m_FrameInterval = 0; - m_PacketSize = 0; - m_stream = NULL; - for(int i = 0; i <= 15; i++) { - ReportConditionCode[i] = 0; - } - clearOnResult(); -} - -uvc::~uvc() -{ - clearOnResult(); -} - -int uvc::setup() -{ - if (!m_init) { - return _init(); - } - return 0; -} - -int uvc::get_jpeg(const char* path) -{ - const int size = 4800; - const int timeout = 5000; - uint8_t* buf = new uint8_t[size]; - DBG_ASSERT(buf); - if (buf == NULL) { - return -1; - } - usb_mjpeg mjpeg(buf, size); - attach(&mjpeg); - Timer t; - t.reset(); - t.start(); - while(t.read_ms() < timeout) { - int stat = isochronous(); - if (mjpeg.status() >= 0) { - break; - } - } - detach(); - int len = mjpeg.status(); - if (len >= 0) { - if (path != NULL) { - FILE *fp = fopen(path, "wb"); - if (fp != NULL) { - for(int i = 0; i < len; i++) { - fputc(buf[i], fp); - } - fclose(fp); - } - } - } - delete[] buf; - return len; -} - -int uvc::get_jpeg(uint8_t* buf, int size) -{ - //DBG("buf=%p size=%d\n", buf, size); - const int timeout = 5000; - usb_mjpeg mjpeg(buf, size); - attach(&mjpeg); - Timer t; - t.reset(); - t.start(); - while(t.read_ms() < timeout) { - int stat = isochronous(); - if (mjpeg.status() >= 0) { - break; - } - } - detach(); - int len = mjpeg.status(); - return len; -} - -bool uvc::interrupt() -{ - if (!m_init) { - _init(); - } - if (m_int_seq == 0) { - int rc = m_pEpIntIn->transfer(m_int_buf, sizeof(m_int_buf)); - if (rc != USBERR_PROCESSING) { - return false; - } - m_int_seq++; - } - int len = m_pEpIntIn->status(); - if (len > 0) { - m_int_seq = 0; - DBG_BYTES("interrupt", m_int_buf, len); - return true; - } - return false; -} - -#define CC_NOERROR 0x0 -#define CC_DATAOVERRUN 0x8 -#define CC_DATAUNDERRUN 0x9 - -inline void DI() -{ - NVIC_DisableIRQ(USB_IRQn); -} - -inline void EI() -{ - NVIC_EnableIRQ(USB_IRQn); -} - -int uvc::isochronous() -{ - if (m_iso_seq == 0) { - uint16_t frame = LPC_USB->HcFmNumber; - m_iso_frame = frame + 10; // 10msec - DBG_ASSERT(m_pEpIsoIn->m_itdActive == 0); - m_iso_seq++; - } - if (m_iso_seq == 1) { - DBG_ASSERT(m_itdCount > 0 && m_itdCount <= 8); - while(m_pEpIsoIn->m_itdActive < m_itdCount) { - int len = m_PacketSize * m_FrameCount; - uint8_t* buf = (uint8_t*)usb_get_bp(len); - if (buf == NULL) { - DBG("len=%d\n", len); - DBG("m_itdCount=%d\n", m_itdCount); - } - DBG_ASSERT(buf); - int rc = m_pEpIsoIn->transfer(m_iso_frame, m_FrameCount, buf, len); - m_iso_frame += m_FrameCount; - DBG_ASSERT(rc == USBERR_PROCESSING); - } - m_iso_seq++; - } - if (m_iso_seq == 2) { - //DBG("frame:%04X\n", LPC_USB->HcFmNumber); - while(1) { - DI(); - bool empty = m_pEpIsoIn->queue_done_itd.empty(); - EI(); - - if (empty) { - break; - } - - DI(); - HCITD* itd = m_pEpIsoIn->queue_done_itd.front(); - m_pEpIsoIn->queue_done_itd.pop(); - EI(); - - m_pEpIsoIn->m_itdActive--; - usb_itd iso_td(itd); - //DBG("frame:%04X\n", LPC_USB->HcFmNumber); - //DBG("itd->Control=%08X\n", itd->Control); - int cc = iso_td.ConditionCode(); - DBG_ASSERT(cc >= 0 && cc <= 15); - ReportConditionCode[cc]++; - if (cc != CC_NOERROR) { - DBG3("%04X ERR:%X\n", LPC_USB->HcFmNumber, cc); - iso_td.free(); - m_iso_seq = 3; - return -1; - } - uint16_t frame = iso_td.StartingFrame(); - int fc = iso_td.FrameCount(); - for(int i = 0; i < fc; i++) { - int len = iso_td.Length(i); - if (len > 0) { - if (m_stream) { - m_stream->input(frame+i, iso_td.BufferPage(i, m_PacketSize), len); - } - onResult(frame+i, iso_td.BufferPage(i, m_PacketSize), len); - } - } - iso_td.free(); - } - //DBG("frame:%04X\n", LPC_USB->HcFmNumber); - m_iso_seq = 1; - return m_pEpIsoIn->m_itdActive; - } - if (m_iso_seq == 3) { // cleanup - DBG("m_pEpIsoIn->queue_done_itd.size() :%d\n", m_pEpIsoIn->queue_done_itd.size()); - while(1) { - DI(); - bool empty = m_pEpIsoIn->queue_done_itd.empty(); - EI(); - - if (empty) { - break; - } - - DI(); - HCITD* itd = m_pEpIsoIn->queue_done_itd.front(); - m_pEpIsoIn->queue_done_itd.pop(); - EI(); - - m_pEpIsoIn->m_itdActive--; - usb_itd iso_td(itd); - iso_td.free(); - } - if (m_pEpIsoIn->m_itdActive == 0) { - m_iso_seq = 0; - } - } - return m_pEpIsoIn->m_itdActive; -} - -void uvc::attach(usb_stream* stream) -{ - m_stream = stream; -} - -void uvc::detach() -{ - m_stream = NULL; -} - -void uvc::onResult(uint16_t frame, uint8_t* buf, int len) -{ - if(m_pCbItem && m_pCbMeth) - (m_pCbItem->*m_pCbMeth)(frame, buf, len); - else if(m_pCb) - m_pCb(frame, buf, len); -} - -void uvc::setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) ) -{ - m_pCb = pMethod; - m_pCbItem = NULL; - m_pCbMeth = NULL; -} - -void uvc::clearOnResult() -{ - m_pCb = NULL; - m_pCbItem = NULL; - m_pCbMeth = NULL; -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/uvc.h --- a/uvc/uvc.h Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -#ifndef UVC_H -#define UVC_H -#include "UsbBaseClass.h" -#include "usb_mem.h" -#include "usb_mjpeg.h" - -#define CLASS_VIDEO 0x0E - -#define SET_CUR 0x01 -#define GET_CUR 0x81 -#define GET_MIN 0x82 -#define GET_MAX 0x83 -#define GET_RES 0x84 -#define GET_LEN 0x85 -#define GET_INFO 0x86 -#define GET_DEF 0x87 - -#define VS_PROBE_CONTROL 0x01 -#define VS_COMMIT_CONTROL 0x02 - -#define PAYLOAD_UNDEF 0 -#define PAYLOAD_MJPEG 1 -#define PAYLOAD_YUY2 2 - -class uvc : public UsbBaseClass { -public: - uvc(int cam = 0); - ~uvc(); - int setup(); - int get_jpeg(const char* path); - int get_jpeg(uint8_t* buf, int size); - bool interrupt(); - int isochronous(); - void attach(usb_stream* stream); - void detach(); - ///set format index - void SetFormatIndex(int index = 1); - ///set frame index - void SetFrameIndex(int index = 1); - ///set frame interval - void SetFrameInterval(int val = 2000000); - ///set packet size - void SetPacketSize(int size = 128); - ///set image size - void SetImageSize(int width = 160, int height = 120); - ///set payload MJPEG or YUY2 - void SetPayload(int payload); // MJPEG,YUV422(YUY2) - UsbErr Control(int req, int cs, int index, uint8_t* buf, int size); - ///Setups the result callback - /** - @param pMethod : callback function - */ - void setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) ); - - ///Setups the result callback - /** - @param pItem : instance of class on which to execute the callback method - @param pMethod : callback method - */ - class CDummy; - template<class T> - void setOnResult( T* pItem, void (T::*pMethod)(uint16_t, uint8_t*, int) ) - { - m_pCb = NULL; - m_pCbItem = (CDummy*) pItem; - m_pCbMeth = (void (CDummy::*)(uint16_t, uint8_t*, int)) pMethod; - } - void clearOnResult(); - - void poll(); - void wait(float s); - void wait_ms(int ms); - uint16_t ReportConditionCode[16]; -protected: - int _init(); - void _config(struct stcamcfg* cfg); - void onResult(uint16_t frame, uint8_t* buf, int len); - bool m_connect; - bool m_init; - int m_cam; - UsbDevice* m_pDev; - UsbEndpoint* m_pEpIntIn; - UsbEndpoint* m_pEpIsoIn; - int m_width; - int m_height; - int m_payload; - int m_FormatIndex; - int m_FrameIndex; - int m_FrameInterval; - int m_PacketSize; - int m_FrameCount; // 1-8 - int m_itdCount; - uint8_t m_int_buf[16]; - int m_int_seq; - int m_iso_seq; - uint16_t m_iso_frame; - usb_stream* m_stream; - CDummy* m_pCbItem; - void (CDummy::*m_pCbMeth)(uint16_t, uint8_t*, int); - void (*m_pCb)(uint16_t, uint8_t*, int); -}; -#endif //UVC_H \ No newline at end of file
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/uvccfg.cpp --- a/uvc/uvccfg.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,401 +0,0 @@ -#include "mbed.h" -#include "uvc.h" -//#define __DEBUG -#include "mydbg.h" -#include "stcamcfg.h" -#include "Utils.h" - -#define DESCRIPTOR_TYPE_DEVICE 1 -#define DESCRIPTOR_TYPE_CONFIGURATION 2 -#define DESCRIPTOR_TYPE_STRING 3 -#define DESCRIPTOR_TYPE_INTERFACE 4 -#define DESCRIPTOR_TYPE_ENDPOINT 5 - -#define DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION 0x0b - -#define DESCRIPTOR_TYPE_HID 0x21 -#define DESCRIPTOR_TYPE_REPORT 0x22 -#define DESCRIPTOR_TYPE_PHYSICAL 0x23 -#define DESCRIPTOR_TYPE_CS_INTERFACE 0x24 -#define DESCRIPTOR_TYPE_CS_ENDPOINT 0x25 -#define DESCRIPTOR_TYPE_HUB 0x29 - -#define CLASS_AUDIO 0x02 -#define CLASS_HUB 0x09 - -#define IF_EQ_THEN_PRINTF(A,B) if (A == B) {VERBOSE("%s\n", #A); -#define ENDIF } - -#define AC_HEADER 0x01 -#define AC_INPUT_TERMINAL 0x02 -#define AC_OUTPUT_TERMINAL 0x03 -#define AC_FEATURE_UNIT 0x06 - -// Input Terminal Types -#define ITT_CAMERA 0x0201 - - -void _parserAudioControl(uint8_t* buf, int len) { - int subtype = buf[2]; - IF_EQ_THEN_PRINTF(AC_HEADER, subtype) - VERBOSE("ADC: %04x\n", LE16(buf+3)); - VERBOSE("TotalLength: %d\n", LE16(buf+5)); - VERBOSE("InCollection: %d\n", buf[7]); - for (int n = 1; n <= buf[7]; n++) { - VERBOSE("aInterfaceNr(%d): %d\n", n, buf[8+n-1]); - } - ENDIF - IF_EQ_THEN_PRINTF(AC_INPUT_TERMINAL, subtype) - VERBOSE("TerminalID: %d\n", buf[3]); - VERBOSE("TerminalType: %04X\n", LE16(buf+4)); - VERBOSE("AssocTermianl: %d\n", buf[6]); - VERBOSE("NrChannels: %d\n", buf[7]); - ENDIF - IF_EQ_THEN_PRINTF(AC_OUTPUT_TERMINAL, subtype) - VERBOSE("TerminalID: %d\n", buf[3]); - VERBOSE("TerminalType: %04X\n", LE16(buf+4)); - VERBOSE("AssocTermianl: %d\n", buf[6]); - ENDIF - IF_EQ_THEN_PRINTF(AC_FEATURE_UNIT, subtype) - VERBOSE("UnitID: %d\n", buf[3]); - VERBOSE("SourceID: %d\n", buf[4]); - VERBOSE("ControlSize: %d\n", buf[5]); - ENDIF -} - -#define AS_GENERAL 0x01 -#define AS_FORMAT_TYPE 0x02 - -void _parserAudioStream(uint8_t* buf, int len) { - int subtype = buf[2]; - IF_EQ_THEN_PRINTF(AS_GENERAL, subtype) - VERBOSE("TerminalLink: %d\n", buf[3]); - VERBOSE("Delay: %d\n", buf[4]); - VERBOSE("FormatTag: %04x\n", LE16(buf+5)); - ENDIF - IF_EQ_THEN_PRINTF(AS_FORMAT_TYPE, subtype) - VERBOSE("FormatType: %d\n", buf[3]); - VERBOSE("NrChannels: %d\n", buf[4]); - VERBOSE("SubFrameSize: %d\n", buf[5]); - VERBOSE("BitResolution: %d\n", buf[6]); - VERBOSE("SamFreqType: %d\n", buf[7]); - VERBOSE("SamFreq(1): %d\n", LE24(buf+8)); - ENDIF -} - -#define CC_VIDEO 0x0e - -#define SC_VIDEOCONTROL 0x01 -#define SC_VIDEOSTREAMING 0x02 - -#define VC_HEADER 0x01 -#define VC_INPUT_TERMINAL 0x02 -#define VC_OUTPUT_TERMINAL 0x03 -#define VC_SELECTOR_UNIT 0x04 -#define VC_PROCESSING_UNIT 0x05 -#define VC_EXTENSION_UNIT 0x06 - -void _parserVideoControl(uint8_t* buf, int len) { - int subtype = buf[2]; - IF_EQ_THEN_PRINTF(VC_HEADER, subtype) - VERBOSE("UVC: %04x\n", LE16(buf+3)); - VERBOSE("TotalLength: %d\n", LE16(buf+5)); - VERBOSE("ClockFrequency: %d\n", LE32(buf+7)); - VERBOSE("InCollection: %d\n", buf[11]); - VERBOSE("aInterfaceNr(1): %d\n", buf[12]); - ENDIF - IF_EQ_THEN_PRINTF(VC_INPUT_TERMINAL, subtype) - VERBOSE("TerminalID: %d\n", buf[3]); - uint16_t tt = LE16(buf+4); - VERBOSE("TerminalType: %04X\n", tt); - VERBOSE("AssocTerminal: %d\n", buf[6]); - VERBOSE("Terminal: %d\n", buf[7]); - if (tt == ITT_CAMERA) { // camera - int bControlSize = buf[14]; - VERBOSE("ControlSize: %d\n", bControlSize); - for(int i = 0; i < bControlSize; i++) { - uint8_t bControls = buf[15+i]; - VERBOSE("Controls(%d): %02X\n", i, bControls); - } - } - ENDIF - IF_EQ_THEN_PRINTF(VC_OUTPUT_TERMINAL, subtype) - VERBOSE("TerminalID: %d\n", buf[3]); - VERBOSE("TerminalType: %04X\n", LE16(buf+4)); - VERBOSE("AssocTerminal: %d\n", buf[6]); - VERBOSE("SourceID: %d\n", buf[7]); - VERBOSE("Terminal: %d\n", buf[8]); - ENDIF - IF_EQ_THEN_PRINTF(VC_SELECTOR_UNIT, subtype) - VERBOSE("UnitID: %d\n", buf[3]); - ENDIF - IF_EQ_THEN_PRINTF(VC_PROCESSING_UNIT, subtype) - VERBOSE("UnitID: %d\n", buf[3]); - VERBOSE("SourceID: %d\n", buf[4]); - VERBOSE("MaxMultiplier: %d\n", LE16(buf+5)); - VERBOSE("ControlSize: %d\n", buf[7]); - int pos = 8; - for (int n = 1; n <= buf[7]; n++) { - VERBOSE("Controls(%d): %02X\n", n , buf[pos]); - pos++; - } - VERBOSE("Processing: %d\n", buf[pos]); - pos++; - VERBOSE("VideoStanders: %02X\n", buf[pos]); - ENDIF - IF_EQ_THEN_PRINTF(VC_EXTENSION_UNIT, subtype) - VERBOSE("UnitID: %d\n", buf[3]); - ENDIF -} - -#define VS_INPUT_HEADER 0x01 -#define VS_STILL_FRAME 0x03 -#define VS_FORMAT_UNCOMPRESSED 0x04 -#define VS_FRAME_UNCOMPRESSED 0x05 -#define VS_FORMAT_MJPEG 0x06 -#define VS_FRAME_MJPEG 0x07 -#define VS_COLOR_FORMAT 0x0d - -void _parserVideoStream(struct stcamcfg* cfg, uint8_t* buf, int len) { - int subtype = buf[2]; - IF_EQ_THEN_PRINTF(VS_INPUT_HEADER, subtype) - VERBOSE("NumFormats: %d\n", buf[3]); - VERBOSE("TotalLength: %d\n", LE16(buf+4)); - VERBOSE("EndpointAddress: %02X\n", buf[6]); - VERBOSE("Info: %02X\n", buf[7]); - VERBOSE("TerminalLink: %d\n", buf[8]); - VERBOSE("StillCaptureMethod: %d\n", buf[9]); - VERBOSE("TriggerSupport: %d\n", buf[10]); - VERBOSE("TriggerUsage: %d\n", buf[11]); - VERBOSE("ControlSize: %d\n", buf[12]); - int pos = 13; - for (int n = 1; n <= buf[12]; n++) { - VERBOSE("Controls(%d): %02X\n", n, buf[pos]); - pos++; - } - cfg->bEndpointAddress = buf[6]; - ENDIF - IF_EQ_THEN_PRINTF(VS_STILL_FRAME, subtype) - VERBOSE("EndpointAdress: %02X\n", buf[3]); - VERBOSE("NumImageSizePatterns: %d\n", buf[4]); - int ptn = buf[4]; - int pos = 5; - for (int n = 1; n <= ptn; n++) { - VERBOSE("Width(%d): %d\n", n, LE16(buf+pos)); - VERBOSE("Height(%d): %d\n", n, LE16(buf+pos+2)); - pos += 4; - } - VERBOSE("NumCompressPtn: %d\n", buf[pos]); - ptn = buf[pos++]; - for (int n = 1; n <= ptn; n++) { - VERBOSE("Compress(%d): %d\n", n, buf[pos]); - pos++; - } - ENDIF - IF_EQ_THEN_PRINTF(VS_FORMAT_UNCOMPRESSED, subtype) - VERBOSE("FormatIndex: %d\n", buf[3]); - VERBOSE("NumFrameDescriptors: %d\n", buf[4]); - uint32_t guid = LE32(buf+5); - if (guid == 0x32595559) { - VERBOSE("GUID: YUY2\n"); - } else if (guid == 0x3231564e) { - VERBOSE("GUID: NV12\n"); - } else { - VERBOSE("GUID: %08x\n", guid); - } - VERBOSE("DefaultFrameIndex: %d\n", buf[22]); - if (cfg->payload == PAYLOAD_YUY2) { - cfg->FormatIndex = buf[3]; - } - ENDIF - IF_EQ_THEN_PRINTF(VS_FRAME_UNCOMPRESSED, subtype) - VERBOSE("FrameIndex: %d\n", buf[3]); - VERBOSE("Capabilites: %d\n", buf[4]); - VERBOSE("Width: %d\n", LE16(buf+5)); - VERBOSE("Height: %d\n", LE16(buf+7)); - VERBOSE("MinBitRate: %d\n", LE32(buf+9)); - VERBOSE("MaxBitRate: %d\n", LE32(buf+13)); - VERBOSE("MaxVideoFrameBufferSize: %d\n", LE32(buf+17)); - VERBOSE("DefaultFrameInterval: %d\n", LE32(buf+21)); - VERBOSE("FrameIntervalType: %d\n", buf[25]); - int it = buf[25]; - uint32_t max_fi = 333333; // 30.0fps - if (it == 0) { - VERBOSE("FrameMinInterval: %d\n", buf[26]); - VERBOSE("FrameMaxInterval: %d\n", buf[30]); - VERBOSE("FrameIntervalStep: %d\n", buf[34]); - } else { - int pos = 26; - for (int n = 1; n <= it; n++) { - uint32_t fi = LE32(buf+pos); - if (fi >= max_fi) { - max_fi = fi; - } - float fps = 1e+7 / fi; - VERBOSE("FrameInterval(%u): %d (%.1f fps)\n", n, fi, fps); - pos += 4; - } - } - if (cfg->payload == PAYLOAD_YUY2) { - if (cfg->width == LE16(buf+5) && cfg->height == LE16(buf+7)) { - cfg->FrameIndex = buf[3]; - } - if (cfg->dwFrameInterval == 0) { - cfg->dwFrameInterval = max_fi; - } - } - ENDIF - IF_EQ_THEN_PRINTF(VS_FORMAT_MJPEG, subtype) - VERBOSE("FormatIndex: %d\n", buf[3]); - VERBOSE("NumFrameDescriptors: %d\n", buf[4]); - VERBOSE("Flags: %d\n", buf[5]); - VERBOSE("DefaultFrameIndex: %d\n", buf[6]); - if (cfg->payload == PAYLOAD_MJPEG) { - cfg->FormatIndex = buf[3]; - } - ENDIF - IF_EQ_THEN_PRINTF(VS_FRAME_MJPEG, subtype) - VERBOSE("FrameIndex: %d\n", buf[3]); - VERBOSE("Capabilites: %d\n", buf[4]); - VERBOSE("Width: %d\n", LE16(buf+5)); - VERBOSE("Height: %d\n", LE16(buf+7)); - VERBOSE("MinBitRate: %d\n", LE32(buf+9)); - VERBOSE("MaxBitRate: %d\n", LE32(buf+13)); - VERBOSE("MaxVideoFrameBufferSize: %d\n", LE32(buf+17)); - VERBOSE("DefaultFrameInterval: %d\n", LE32(buf+21)); - VERBOSE("FrameIntervalType: %d\n", buf[25]); - int it = buf[25]; - uint32_t max_fi = 333333; // 30.0fps - if (it == 0) { - VERBOSE("FrameMinInterval: %d\n", buf[26]); - VERBOSE("FrameMaxInterval: %d\n", buf[30]); - VERBOSE("FrameIntervalStep: %d\n", buf[34]); - } else { - int pos = 26; - for (int n = 1; n <= it; n++) { - uint32_t fi = LE32(buf+pos); - if (fi >= max_fi) { - max_fi = fi; - } - float fps = 1e+7 / fi; - VERBOSE("FrameInterval(%u): %d (%.1f fps)\n", n, fi, fps); - pos += 4; - } - } - if (cfg->payload == PAYLOAD_MJPEG) { - if (cfg->width == LE16(buf+5) && cfg->height == LE16(buf+7)) { - cfg->FrameIndex = buf[3]; - } - if (cfg->dwFrameInterval == 0) { - cfg->dwFrameInterval = max_fi; - } - } - ENDIF - IF_EQ_THEN_PRINTF(VS_COLOR_FORMAT, subtype) - ENDIF -} - -void _parserConfigurationDescriptor(struct stcamcfg* cfg, uint8_t* buf, int len) { - //DBG("buf=%p len=%d\n", buf, len); - //DBG_HEX(buf, len); - int pos = 0; - cfg->_IfClass = 0; - cfg->_IfSubClass = 0; - while (pos < len) { - int type = buf[pos+1]; - //DBG_BYTES(TYPE_Str(type), buf+pos, buf[pos]); - IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_CONFIGURATION, type) - VERBOSE("NumInterfaces: %d\n", buf[pos+4]); - ENDIF - IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, type) - VERBOSE("FirstInterface: %d\n", buf[pos+2]); - VERBOSE("InterfaceCount: %d\n", buf[pos+3]); - VERBOSE("FunctionClass: %02X\n", buf[pos+4]); - VERBOSE("FunctionSubClass: %02X\n", buf[pos+5]); - VERBOSE("FunctionProtocol: %02X\n", buf[pos+6]); - VERBOSE("Function: %d\n", buf[pos+7]); - ENDIF - IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_INTERFACE,type) - VERBOSE("InterfaceNumber: %d\n", buf[pos+2]); - VERBOSE("AlternateSetting: %d\n", buf[pos+3]); - VERBOSE("NumEndpoint: %d\n", buf[pos+4]); - VERBOSE("InterfaceClass: %02X\n", buf[pos+5]); - VERBOSE("InterfaceSubClass: %02X\n", buf[pos+6]); - VERBOSE("InterfaceProtocol: %02X\n", buf[pos+7]); - VERBOSE("Interface: %d\n", buf[pos+8]); - cfg->_If = buf[pos+2]; - cfg->_Ifalt = buf[pos+3]; - cfg->_IfClass = buf[pos+5]; - cfg->_IfSubClass = buf[pos+6]; - ENDIF - IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_ENDPOINT, type) - VERBOSE("EndpointAddress: %02X\n", buf[pos+2]); - VERBOSE("Attributes: %02X\n", buf[pos+3]); - VERBOSE("MaxPacketSize: %d\n", LE16(buf+pos+4)); - VERBOSE("Interval: %d\n", buf[pos+6]); - if (cfg->_IfClass == CC_VIDEO && cfg->_IfSubClass == SC_VIDEOSTREAMING) { - if (cfg->bEndpointAddress == buf[pos+2]) { - if (cfg->wMaxPacketSize == 0) { - cfg->wMaxPacketSize = LE16(buf+pos+4); - } - if (cfg->wMaxPacketSize == LE16(buf+pos+4)) { - cfg->bInterface = cfg->_If; - cfg->bAlternate = cfg->_Ifalt; - } - } - } - ENDIF - IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_CS_INTERFACE, type) - IF_EQ_THEN_PRINTF(CC_VIDEO, cfg->_IfClass) - IF_EQ_THEN_PRINTF(SC_VIDEOCONTROL, cfg->_IfSubClass) - _parserVideoControl(buf+pos, buf[pos]); - ENDIF - IF_EQ_THEN_PRINTF(SC_VIDEOSTREAMING, cfg->_IfSubClass) - _parserVideoStream(cfg, buf+pos, buf[pos]); - ENDIF - ENDIF - if (cfg->_IfClass == CLASS_AUDIO) { - if (cfg->_IfSubClass == 0x01) { - _parserAudioControl(buf+pos, buf[pos]); - } else if (cfg->_IfSubClass == 0x02) { - _parserAudioStream(buf+pos, buf[pos]); - } - } - ENDIF - IF_EQ_THEN_PRINTF(DESCRIPTOR_TYPE_HUB, type) - ENDIF - pos += buf[pos]; - } -} - -void uvc::_config(struct stcamcfg* cfg) -{ - DBG_ASSERT(cfg); - int index = 0; - uint8_t temp[4]; - int rc = m_pDev->GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, temp, sizeof(temp)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("Config Descriptor 4bytes", temp, sizeof(temp)); - DBG_ASSERT(temp[0] == 9); - DBG_ASSERT(temp[1] == 0x02); - int TotalLength = LE16(temp+2); - DBG("TotalLength: %d\n", TotalLength); - - uint8_t* buf = new uint8_t[TotalLength]; - DBG_ASSERT(buf); - rc = m_pDev->GetDescriptor(USB_DESCRIPTOR_TYPE_CONFIGURATION, index, - buf, TotalLength); - DBG_ASSERT(rc == USBERR_OK); - - _parserConfigurationDescriptor(cfg, buf, TotalLength); - - DBG("cfg->FrameIndex=%d\n", cfg->FrameIndex); - DBG("cfg->dwFrameInterval=%u\n", cfg->dwFrameInterval); - - //DBG_ASSERT(cfg->FormatIndex >= 1); - //DBG_ASSERT(cfg->FormatIndex <= 2); - //DBG_ASSERT(cfg->FrameIndex >= 1); - //DBG_ASSERT(cfg->FrameIndex <= 6); - - delete[] buf; -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/uvcctl.cpp --- a/uvc/uvcctl.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -#include "mbed.h" -#include "uvc.h" -#define __DEBUG -#include "mydbg.h" - -UsbErr uvc::Control(int req, int cs, int index, uint8_t* buf, int size) -{ - UsbErr rc; - if (req == SET_CUR) { - rc = m_pDev->controlSend( - USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, - req, cs<<8, index, buf, size); - return rc; - } - rc = m_pDev->controlReceive( - USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, - req, cs<<8, index, buf, size); - return rc; -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/uvcini.cpp --- a/uvc/uvcini.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -#include "mbed.h" -#include "uvc.h" -//#define __DEBUG -#include "mydbg.h" -#include "stcamcfg.h" - -const struct stcamcfg stcamcfg_table[] = { -/* -{0x045e, 0x074a, -160,120, -PAYLOAD_MJPEG, -0x81, 128, -1, 5, 2000000, // 160x120 5.0fps -1, 1, "Microsoft LifeCam VX-700", -8, 3, -},*/ -/* -{0x0c45, 0x62c0, -160,120, -PAYLOAD_MJPEG, -0x81, 128, -1, 5, 2000000, // 160x120 5.0fps -1, 1, "UVCA130AF", -8, 3, -},*/ - -{0x046d, 0x0994, -160,120, -PAYLOAD_MJPEG, -0, 0, -0, 0, 2000000, // 160x120 10.0fps -0, 0, "Logitech QuickCam Orbit AF", -0, 3, -}, -{0x0000, 0x0000, -160,120, -PAYLOAD_MJPEG, -0x00, 0, -0, 0, 2000000, -0, 0, "default", -0, 3, -}, -}; - -inline void LE32(uint32_t n, uint8_t* d) -{ - d[0] = (uint8_t)n; - d[1] = (uint8_t)(n >> 8); - d[2] = (uint8_t)(n >> 16); - d[3] = (uint8_t)(n >> 24); -} - -void uvc::SetFormatIndex(int index) -{ - DBG_ASSERT(index >= 1); - DBG_ASSERT(index <= 2); - m_FormatIndex = index; -} - -void uvc::SetFrameIndex(int index) -{ - DBG_ASSERT(index >= 1); - DBG_ASSERT(index <= 8); - m_FrameIndex = index; -} - -void uvc::SetFrameInterval(int val) -{ - DBG_ASSERT(val >= 333333); - DBG_ASSERT(val <= 10000000); - m_FrameInterval = val; -} - -void uvc::SetPacketSize(int size) -{ - DBG_ASSERT(size >= 128); - DBG_ASSERT(size <= 956); - m_PacketSize = size; -} - -void uvc::SetImageSize(int width, int height) -{ - DBG_ASSERT(width >= 160); - DBG_ASSERT(width <= 800); - DBG_ASSERT(height >= 120); - DBG_ASSERT(height <= 600); - m_width = width; - m_height = height; -} - -void uvc::SetPayload(int payload) -{ - DBG_ASSERT(payload == PAYLOAD_MJPEG || payload == PAYLOAD_YUY2); - m_payload = payload; -} - -void uvc::poll() -{ - isochronous(); -} - -int uvc::_init() -{ - m_init = true; - UsbErr rc; - for(int i = 0; i < 2; i++) { - m_pDev = m_pHost->getDeviceByClass(CLASS_VIDEO, m_cam); // UVC - if (m_pDev || i > 0) { - break; - } - rc = Usb_poll(); - if (rc == USBERR_PROCESSING) { - VERBOSE("%p USBERR_PROCESSING\n", this); - return -1; - } - } - DBG("m_pDev=%p\n", m_pDev); - if (!m_pDev) { - VERBOSE("%p UVC CAMERA(%d) NOT FOUND\n", this, m_cam); - return -1; - } - DBG_ASSERT(m_pDev); - - struct stcamcfg cfg; - for(int i = 0; ; i++) { - cfg = stcamcfg_table[i]; - if (cfg.idVender == 0x0000) { - DBG("not cam config\n"); - DBG("vid: %04X\n", m_pDev->getVid()); - DBG("pid: %04X\n", m_pDev->getPid()); - break; - } - if (cfg.idVender == m_pDev->getVid() && cfg.idProduct == m_pDev->getPid()) { - DBG_ASSERT(cfg.name); - DBG("found %s\n", cfg.name); - break; - } - } - - if (m_width) { - cfg.width = m_width; - } - if (m_height) { - cfg.height = m_height; - } - if (m_payload != PAYLOAD_UNDEF) { - cfg.payload = m_payload; - } - if (m_FormatIndex) { - cfg.FormatIndex = m_FormatIndex; - } - if (m_FrameIndex) { - cfg.FrameIndex = m_FrameIndex; - } - if (m_FrameInterval) { - cfg.dwFrameInterval = m_FrameInterval; - } - if (m_PacketSize) { - cfg.wMaxPacketSize = m_PacketSize; - } - - _config(&cfg); - - if (cfg.payload == PAYLOAD_YUY2) { - if (cfg.FormatIndex == 0) { - VERBOSE("YUY2 FORMAT NOT FOUND\n"); - return -1; - } - } - - if (cfg.iso_FrameCount == 0) { - int c = usb_bp_size() / cfg.wMaxPacketSize; - if (c > 8) { - c = 8; - } - cfg.iso_FrameCount = c; - } - DBG_ASSERT(cfg.iso_FrameCount >= 1); - DBG_ASSERT(cfg.iso_FrameCount <= 8); - DBG_ASSERT((cfg.iso_FrameCount * cfg.wMaxPacketSize) <= usb_bp_size()); - if (cfg.iso_itdCount == 0) { - cfg.iso_itdCount = 3; - } - DBG_ASSERT(cfg.iso_itdCount >= 1); - DBG("cfg.wMaxPacketSize=%d\n", cfg.wMaxPacketSize); - DBG("cfg.iso_FrameCount=%d\n", cfg.iso_FrameCount); - DBG("cfg.iso_itdCount=%d\n", cfg.iso_itdCount); - DBG_ASSERT(cfg.iso_FrameCount >= 1 && cfg.iso_FrameCount <= 8); - //m_pEpIntIn = new UsbEndpoint(m_pDev, 0x83, true, USB_INT, 16); - //DBG_ASSERT(m_pEpIntIn); - - DBG_ASSERT(cfg.bEndpointAddress == 0x81); - DBG_ASSERT(cfg.wMaxPacketSize >= 128); - DBG_ASSERT(cfg.wMaxPacketSize <= 956); - m_PacketSize = cfg.wMaxPacketSize; - DBG_ASSERT(m_PacketSize); - m_pEpIsoIn = new UsbEndpoint(m_pDev, cfg.bEndpointAddress, true, USB_ISO, m_PacketSize); - DBG_ASSERT(m_pEpIsoIn); - - DBG_ASSERT(cfg.FormatIndex >= 1); - DBG_ASSERT(cfg.FormatIndex <= 2); - DBG_ASSERT(cfg.FrameIndex >= 1); - DBG_ASSERT(cfg.FrameIndex <= 8); - DBG_ASSERT(cfg.dwFrameInterval <= 10000000); - DBG_ASSERT(cfg.dwFrameInterval >= 333333); - - uint8_t temp1[1]; - temp1[0] = 0x00; - rc = Control(GET_INFO, VS_PROBE_CONTROL, 1, temp1, sizeof(temp1)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("GET_INFO Probe ", temp1, sizeof(temp1)); - - uint8_t temp[34]; - rc = Control(GET_CUR, VS_PROBE_CONTROL, 1, temp, sizeof(temp)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("GET_CUR Probe ", temp, sizeof(temp)); - - uint8_t param[34]; - memset(param, 0x00, sizeof(param)); - param[0] = 0x00; - param[2] = cfg.FormatIndex; - param[3] = cfg.FrameIndex; // 160x120 - LE32(cfg.dwFrameInterval, param+4); // Frame Interval - - DBG_BYTES("SET_CUR Probe ", param, sizeof(param)); - rc = Control(SET_CUR, VS_PROBE_CONTROL, 1, param, sizeof(param)); - DBG_ASSERT(rc == USBERR_OK); - - rc = Control(GET_CUR, VS_PROBE_CONTROL, 1, temp, sizeof(temp)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("GET_CUR Probe ", temp, sizeof(temp)); - - rc = Control(GET_CUR, VS_COMMIT_CONTROL, 1, temp, sizeof(temp)); - DBG_ASSERT(rc == USBERR_OK); - DBG_BYTES("GET_CUR Commit", temp, sizeof(temp)); - - DBG_BYTES("SET_CUR Commit", param, sizeof(param)); - rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, param, sizeof(param)); - DBG_ASSERT(rc == USBERR_OK); - - //USBH_SET_INTERFACE(1, 1); // alt=1 size=128 - DBG_ASSERT(cfg.bInterface >= 1); - DBG_ASSERT(cfg.bAlternate >= 1); - DBG_ASSERT(cfg.bAlternate <= 6); - //rc = m_pDev->controlSend( - // USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, - // SET_INTERFACE, cfg.bAlternate, cfg.bInterface, NULL, 0); - rc = m_pDev->SetInterfaceAlternate(cfg.bInterface, cfg.bAlternate); - DBG_ASSERT(rc == USBERR_OK); - - DBG_ASSERT(cfg.iso_FrameCount >= 1); - DBG_ASSERT(cfg.iso_FrameCount <= 8); - m_FrameCount = cfg.iso_FrameCount; - DBG_ASSERT(cfg.iso_itdCount >= 1); - DBG_ASSERT(cfg.iso_itdCount <= 8); - m_itdCount = cfg.iso_itdCount; - - LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable - LPC_USB->HcControl |= OR_CONTROL_IE; // IsochronousEnable - - m_connect = true; - return 0; -}
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvc/uvcsub.cpp --- a/uvc/uvcsub.cpp Wed Jun 06 11:47:06 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -#include "mbed.h" -#include "uvc.h" - -void uvc::wait(float s) -{ - Timer t; - t.start(); - while(t.read() < s) { - poll(); - } -} - -void uvc::wait_ms(int ms) -{ - Timer t; - t.start(); - while(t.read_ms() < ms) { - poll(); - } -} -
diff -r 2b4ea8a138e5 -r 7a4f2c038803 uvchost.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uvchost.lib Tue Aug 14 03:42:12 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/va009039/code/uvchost/#812d604caad4