
Simple USBHost WebCam test program
Dependencies: F401RE-USBHost mbed
Fork of KL46Z-USBHostC270_example by
WebカメラからJPEG画像を読み取るテストプログラムです。
使い方はKL46Z-USBHostC270_exampleと同じです。
動作確認カメラ: Logitech C270, Logitech C210, Logitech Q200R(Qcam Orbit AF), LifeCam VX-500
Revision 3:b2f688e2ddd7, committed 2014-06-10
- Comitter:
- va009039
- Date:
- Tue Jun 10 07:35:46 2014 +0000
- Parent:
- 2:2a40888db9fc
- Child:
- 4:efa6fc1219e7
- Commit message:
- first commit
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/F401RE-USBHost.lib Tue Jun 10 07:35:46 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/va009039/code/F401RE-USBHost/#8774c07f12a5
--- a/KL46Z-USBHost.lib Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/va009039/code/KL46Z-USBHost/#6463cd1964c0
--- a/KL46Z_USBHostC270/BaseUvc.cpp Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -// BaseUvc.cpp -#include "USBHostConf.h" -#include "USBHost.h" -#include "BaseUvc.h" - -void BaseUvc::poll() -{ - uint8_t buf[ep_iso_in->getSize()]; - int result = host->IsochronousRead(ep_iso_in, buf, sizeof(buf)); - if (result >= 0) { - uint16_t frame = 0; - onResult(frame, buf, ep_iso_in->getLengthTransferred()); - } -} - -USB_TYPE BaseUvc::Control(int req, int cs, int index, uint8_t* buf, int size) -{ - if (req == SET_CUR) { - return host->controlWrite(dev, - USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, - req, cs<<8, index, buf, size); - } - return host->controlRead(dev, - USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, - req, cs<<8, index, buf, size); -} - -USB_TYPE BaseUvc::setInterfaceAlternate(uint8_t intf, uint8_t alt) -{ - return host->controlWrite(dev, USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, - SET_INTERFACE, alt, intf, NULL, 0); -} - -void BaseUvc::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 BaseUvc::setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) ) -{ - m_pCb = pMethod; - m_pCbItem = NULL; - m_pCbMeth = NULL; -} - -void BaseUvc::clearOnResult() -{ - m_pCb = NULL; - m_pCbItem = NULL; - m_pCbMeth = NULL; -} -
--- a/KL46Z_USBHostC270/BaseUvc.h Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -// BaseUvc.h -//#include "USBIsochronous.h" -#pragma once - -// --- UVC -------------------------------------------------- -#define _30FPS 333333 -#define _25FPS 400000 -#define _20FPS 500000 -#define _15FPS 666666 -#define _10FPS 1000000 -#define _5FPS 2000000 -#define _1FPS 10000000 - -#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 - -class BaseUvc { -public: - void poll(); - USB_TYPE Control(int req, int cs, int index, uint8_t* buf, int size); - USB_TYPE setInterfaceAlternate(uint8_t intf, uint8_t alt); - //IsochronousEp* m_isoEp; - // callback - void onResult(uint16_t frame, uint8_t* buf, int len); - void setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) ); - 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(); - CDummy* m_pCbItem; - void (CDummy::*m_pCbMeth)(uint16_t, uint8_t*, int); - void (*m_pCb)(uint16_t, uint8_t*, int); -protected: - USBHost * host; - USBDeviceConnected * dev; - USBEndpoint* ep_iso_in; -};
--- a/KL46Z_USBHostC270/CamInfo.cpp Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +0,0 @@ -// CamInfo.cpp -#include "USBHostCam.h" - -// Logitech C270 -#define C270_VID 0x046d -#define C270_PID 0x0825 -#define C270_160x120 2 -#define C270_176x144 3 -#define C270_320x176 4 -#define C270_320x240 5 -#define C270_352x288 6 -#define C270_432x240 7 -#define C270_640x480 1 -#define C270_544x288 8 -#define C270_640x360 9 -#define C270_752x416 10 -#define C270_800x448 11 -#define C270_800x600 12 - -#define C270_MJPEG 2 -#define C270_YUV2 1 - -#define C270_EN 0x81 -#define C270_MPS 192 -#define C270_IF_ALT_192 1 -#define C270_IF_ALT(A) C270_IF_ALT_##A - -#define C270_INFO(SIZE) {C270_VID, C270_PID, _##SIZE, 0, \ - "C270", \ - C270_MJPEG, \ - C270_##SIZE, \ - _5FPS, \ - C270_EN, \ - 192, \ - C270_IF_ALT(192), \ - } - -#define C210_PID 0x819 -#define C210_INFO(SIZE) {C270_VID, C210_PID, _##SIZE, 0, \ - "C270", \ - C270_MJPEG, \ - C270_##SIZE, \ - _5FPS, \ - C270_EN, \ - 192, \ - C270_IF_ALT(192), \ - } - -// Logitech Qcam Orbit AF QCAM-200R -#define Q200R_VID 0x046d -#define Q200R_PID 0x0994 -#define Q200R_160x120 1 -#define Q200R_176x144 2 -#define Q200R_320x240 3 -#define Q200R_352x288 4 -#define Q200R_640x480 5 -#define Q200R_800x600 6 - -#define Q200R_MJPEG 1 -#define Q200R_YUV2 2 - -#define Q200R_EN 0x81 -#define Q200R_MPS 192 -#define Q200R_IF_ALT_192 1 -#define Q200R_IF_ALT_384 2 -#define Q200R_IF_ALT_512 3 -#define Q200R_IF_ALT_640 4 -#define Q200R_IF_ALT_800 5 -#define Q200R_IF_ALT_944 6 -#define Q200R_IF_ALT(A) Q200R_IF_ALT_##A -#define Q200R_INFO(SIZE) {Q200R_VID, Q200R_PID, _##SIZE, 0, \ - "Q200R", \ - Q200R_MJPEG, \ - Q200R_##SIZE, \ - _5FPS, \ - Q200R_EN, \ - 192, \ - Q200R_IF_ALT(192), \ - } - -//LifeCam VX700 / VX500 -#define VX700_VID 0x045e -#define VX700_PID 0x074a - -#define VX700_160x120 5 -#define VX700_176x144 4 -#define VX700_320x240 3 -#define VX700_352x288 2 -#define VX700_640x480 1 - -#define VX700_MJPEG 1 - -#define VX700_EN 0x81 -#define VX700_MPS 128 -#define VX700_IF_ALT_128 1 -#define VX700_IF_ALT(A) VX700_IF_ALT_##A -#define VX700_INFO(SIZE) {VX700_VID, VX700_PID, _##SIZE, 0, \ - "VX700", \ - VX700_MJPEG, \ - VX700_##SIZE, \ - _5FPS, \ - VX700_EN, \ - 128, \ - VX700_IF_ALT(128), \ - } - -//Sonix USB 2.0 Camera -#define SONIX_160x120 5 -#define SONIX_176x144 4 -#define SONIX_320x240 3 -#define SONIX_352x288 2 -#define SONIX_640x480 1 - -#define SONIX_IF_ALT_128 1 -#define SONIX_IF_ALT_256 2 -#define SONIX_IF_ALT_512 3 -#define SONIX_IF_ALT_600 4 -#define SONIX_IF_ALT_800 5 -#define SONIX_IF_ALT_956 6 -#define SONIX_IF_ALT(A) SONIX_IF_ALT_##A -#define SONIX_INFO(SIZE) {0x0c45, 0x62c0, _##SIZE, 0, \ - "SONIX", \ - 1, \ - SONIX_##SIZE, \ - _5FPS, \ - 0x81, \ - 128, \ - SONIX_IF_ALT(128), \ - } - -static const CamInfo CamInfoList[] = { -// Logitech C270 -C270_INFO(160x120), -C270_INFO(176x144), -C270_INFO(320x176), -C270_INFO(320x240), -C270_INFO(352x288), -C270_INFO(432x240), -C270_INFO(640x480), -C270_INFO(544x288), -C270_INFO(640x360), -C270_INFO(752x416), -C270_INFO(800x448), -C270_INFO(800x600), - -// Logitech C210 -C210_INFO(160x120), -C210_INFO(176x144), -C210_INFO(320x176), -C210_INFO(320x240), -C210_INFO(352x288), -C210_INFO(432x240), -C210_INFO(640x480), -C210_INFO(544x288), -C210_INFO(640x360), -C210_INFO(752x416), -C210_INFO(800x448), -C210_INFO(800x600), - -// Logitech Qcam Orbit AF QCAM-200R -Q200R_INFO(160x120), -Q200R_INFO(176x144), -Q200R_INFO(320x240), -Q200R_INFO(352x288), -Q200R_INFO(640x480), -Q200R_INFO(800x600), - -// LifeCam VX700 -VX700_INFO(160x120), -VX700_INFO(176x144), -VX700_INFO(320x240), -VX700_INFO(352x288), -VX700_INFO(640x480), - -// Sonix USB 2.0 Camera -SONIX_INFO(160x120), -SONIX_INFO(176x144), -SONIX_INFO(320x240), -SONIX_INFO(352x288), -SONIX_INFO(640x480), - -// Not found -{0,0,0,0}, -}; - -CamInfo* getCamInfoList() { - return const_cast<CamInfo*>(CamInfoList); -}
--- a/KL46Z_USBHostC270/USBHostCam.cpp Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -// USBHostCam.cpp -#include "USBHostCam.h" - -#if 0 -#define CAM_DBG(x, ...) std::printf("[%s:%d]"x"\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); -#else -#define CAM_DBG(...) while(0); -#endif -#define CAM_INFO(...) do{fprintf(stderr,__VA_ARGS__);}while(0); -#define USB_INFO(...) do{fprintf(stderr,__VA_ARGS__);}while(0); - -CamInfo* getCamInfoList(); // CamInfo.cpp - -USBHostCam::USBHostCam(uint8_t size, uint8_t option, CamInfo* user_caminfo) -{ - CAM_DBG("size: %d, option: %d", size, option); - _caminfo_size = size; - _caminfo_option = option; - if (user_caminfo) { - CamInfoList = user_caminfo; - } else { - CamInfoList = getCamInfoList(); - } - clearOnResult(); - host = USBHost::getHostInst(); - dev = host->getDevice(0); - ep_iso_in = new USBEndpoint; - init(); -} - -void USBHostCam::init() -{ - CAM_DBG(""); - dev_connected = false; - dev = NULL; - cam_intf = -1; - device_found = false; - caminfo_found = false; -} - -bool USBHostCam::connected() -{ - return dev_connected; -} - -bool USBHostCam::connect() -{ - if (dev_connected) { - return true; - } - - for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { - if ((dev = host->getDevice(i)) != NULL) { - - CAM_DBG("Trying to connect Cam device\r\n"); - - if(host->enumerate(dev, this)) { - break; - } - if (device_found) { - USB_INFO("New Cam: %s device: VID:%04x PID:%04x [dev: %p - intf: %d]\n", caminfo->name, dev->getVid(), dev->getPid(), dev, cam_intf); - dev->setName(caminfo->name, cam_intf); - //host->registerDriver(dev, cam_intf, this, &USBHostCam::onDisconnect); - int addr = dev->getAddress(); - ep_iso_in->setDevice(dev); - ep_iso_in->setAddress(caminfo->en); - ep_iso_in->setSize(caminfo->mps); - //ep_iso_in->init(addr, caminfo->en, caminfo->mps, caminfo->frameCount, caminfo->queueLimit); - uint8_t buf[26]; - memset(buf, 0, sizeof(buf)); - buf[2] = caminfo->formatIndex; - buf[3] = caminfo->frameIndex; - *reinterpret_cast<uint32_t*>(buf+4) = caminfo->interval; - USB_TYPE res = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, sizeof(buf)); - if (res != USB_TYPE_OK) { - CAM_DBG("SET_CUR VS_COMMIT_CONTROL FAILED"); - } - res = setInterfaceAlternate(1, caminfo->if_alt); - if (res != USB_TYPE_OK) { - CAM_DBG("SET_INTERFACE FAILED"); - } - dev_connected = true; - return true; - } - } - } - init(); - return false; -} - -#if 0 -void USBHostCam::setup() { - caminfo = CamInfoList; - bool found = false; - while(caminfo->vid != 0) { - if (caminfo->vid == host->getDevice(0)->getVid() && - caminfo->pid == host->getDevice(0)->getPid() && - caminfo->size == _caminfo_size && caminfo->option == _caminfo_option) { - found = true; - break; - } - caminfo++; - } - if (!found) { - CAM_INFO("caminfo not found.\n"); - exit(1); - } - CAM_INFO("Found: %s\n", caminfo->name); - - ep_iso_in.setAddress(caminfo->en); - ep_iso_in.setSize(caminfo->mps); - uint8_t buf[26]; - memset(buf, 0, sizeof(buf)); - buf[2] = caminfo->formatIndex; - buf[3] = caminfo->frameIndex; - *reinterpret_cast<uint32_t*>(buf+4) = caminfo->interval; - USB_TYPE res = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, sizeof(buf)); - if (res != USB_TYPE_OK) { - CAM_DBG("SET_CUR VS_COMMIT_CONTROL FAILED"); - } - res = setInterfaceAlternate(1, caminfo->if_alt); - if (res != USB_TYPE_OK) { - CAM_DBG("SET_INTERFACE FAILED"); - } -} -#endif - - -/*virtual*/ void USBHostCam::setVidPid(uint16_t vid, uint16_t pid) -{ - CAM_DBG("vid:%04x,pid:%04x", vid, pid); - caminfo = CamInfoList; - while(caminfo->vid != 0) { - if (caminfo->vid == vid && caminfo->pid == pid && - caminfo->size == _caminfo_size && caminfo->option == _caminfo_option) { - caminfo_found = true; - break; - } - caminfo++; - } -} - -/*virtual*/ bool USBHostCam::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed -{ - CAM_DBG("intf_nb=%d,intf_class=%02X,intf_subclass=%d,intf_protocol=%d", intf_nb, intf_class, intf_subclass, intf_protocol); - if ((cam_intf == -1) && caminfo_found) { - cam_intf = intf_nb; - device_found = true; - return true; - } - return false; -} - -/*virtual*/ bool USBHostCam::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used -{ - CAM_DBG("intf_nb:%d,type:%d,dir:%d",intf_nb, type, dir); - return false; -} - -#define SEQ_READ_IDOL 0 -#define SEQ_READ_EXEC 1 -#define SEQ_READ_DONE 2 - -int USBHostCam::readJPEG(uint8_t* buf, int size, int timeout_ms) { - _buf = buf; - _pos = 0; - _size = size; - _seq = SEQ_READ_IDOL; - setOnResult(this, &USBHostCam::callback_motion_jpeg); - Timer timeout_t; - timeout_t.reset(); - timeout_t.start(); - while(timeout_t.read_ms() < timeout_ms && _seq != SEQ_READ_DONE) { - poll(); - } - return _pos; -} - -/* virtual */ void USBHostCam::outputJPEG(uint8_t c, int status) { // from decodeMJPEG - if (_seq == SEQ_READ_IDOL) { - if (status == JPEG_START) { - _pos = 0; - _seq = SEQ_READ_EXEC; - } - } - if (_seq == SEQ_READ_EXEC) { - if (_pos < _size) { - _buf[_pos++] = c; - } - if (status == JPEG_END) { - _seq = SEQ_READ_DONE; - } - } -} - -void USBHostCam::callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) { - inputPacket(buf, len); -}
--- a/KL46Z_USBHostC270/USBHostCam.h Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -// USBHostCam.h -#include "USBHostConf.h" -#include "USBHost.h" -#include "BaseUvc.h" -#include "decodeMJPEG.h" -#pragma once - -#define _160x120 2 -#define _176x144 3 -#define _320x176 4 -#define _320x240 5 -#define _352x288 6 -#define _432x240 7 -#define _640x480 1 -#define _544x288 8 -#define _640x360 9 -#define _752x416 10 -#define _800x448 11 -#define _800x600 12 - -#define TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; - -struct CamInfo { - uint16_t vid; - uint16_t pid; - uint8_t size; - uint8_t option; -// - const char* name; - uint8_t formatIndex; - uint8_t frameIndex; - uint32_t interval; - uint8_t en; - uint8_t mps; - uint8_t if_alt; -}; - -/** - * A class to communicate a Cam - */ -class USBHostCam : public IUSBEnumerator, public BaseUvc, public decodeMJPEG { -public: - /** - * Constructor - * - */ - USBHostCam(uint8_t size = _160x120, uint8_t option = 0, CamInfo* user_caminfo = NULL); - - /** - * Check if a Cam device is connected - * - * @return true if a Cam device is connected - */ - bool connected(); - - /** - * Try to connect to a Cam device - * - * @return true if connection was successful - */ - bool connect(); - - /** - * read jpeg image - * - * @param buf read buffer - * @param size buffer size - * @param timeout_ms timeout default 15sec - * @return jpeg size if read success else -1 - */ - int readJPEG(uint8_t* buf, int size, int timeout_ms = 15*1000); - -protected: - //From IUSBEnumerator - virtual void setVidPid(uint16_t vid, uint16_t pid); - virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed - virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used - -private: - bool dev_connected; - - int cam_intf; - bool device_found; - bool caminfo_found; - - uint8_t _seq; - uint8_t* _buf; - int _pos; - int _size; - CamInfo* CamInfoList; - CamInfo* caminfo; - uint8_t _caminfo_size; - uint8_t _caminfo_option; - - virtual void outputJPEG(uint8_t c, int status); // from decodeMJPEG - void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len); - void init(); -};
--- a/KL46Z_USBHostC270/decodeMJPEG.cpp Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,180 +0,0 @@ -// decodeMJPEG.cpp 2012/12/8 -// decode motion-jpeg to jpeg -#include "mbed.h" -#include "decodeMJPEG.h" - -#define MARK_SOF0 0xc0 -#define MARK_DHT 0xc4 -#define MARK_RST0 0xd0 -#define MARK_RST7 0xd7 -#define MARK_SOI 0xd8 -#define MARK_EOI 0xd9 -#define MARK_SOS 0xda -#define MARK_DQT 0xdb -#define MARK_DRI 0xdd -#define MARK_APP 0xe0 - -#define SEQ_INIT 0 -#define SEQ_SOI 1 -#define SEQ_FRAME 2 -#define SEQ_MARK 3 -#define SEQ_SEG_LEN 4 -#define SEQ_SEG_LEN2 5 -#define SEQ_SEG_BODY 6 -#define SEQ_SOS 7 -#define SEQ_SOS2 8 - -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, -}; - -decodeMJPEG::decodeMJPEG() -{ - m_seq = SEQ_INIT; -} - -void decodeMJPEG::inputPacket(const uint8_t* buf, int len) -{ - for(int i = 12; i < len; i++) { - input(buf[i]); - } -} - -void decodeMJPEG::input(uint8_t c) -{ - switch(m_seq) { - case SEQ_INIT: - if (c == 0xff) { - m_seq = SEQ_SOI; - } - break; - case SEQ_SOI: - if (c == MARK_SOI) { - outputJPEG(0xff, JPEG_START); // start - outputJPEG(c); - m_bDHT = false; - m_seq = SEQ_FRAME; - } else { - m_seq = SEQ_INIT; - } - break; - case SEQ_FRAME: - if (c == 0xff) { - m_seq = SEQ_MARK; - } else { - m_seq = SEQ_INIT; - } - break; - case SEQ_MARK: - if (c == MARK_SOI || c == MARK_EOI || c == 0x00) { - m_seq = SEQ_INIT; - break; - } - m_mark = c; - m_seq = SEQ_SEG_LEN; - break; - case SEQ_SEG_LEN: - m_seg_len = c; - m_seq = SEQ_SEG_LEN2; - break; - case SEQ_SEG_LEN2: - m_seg_len <<= 8; - m_seg_len |= c; - m_seg_len -= 2; - m_seg_pos = 0; - m_seq = SEQ_SEG_BODY; - if (m_mark == MARK_SOS) { - if (m_bDHT == false) { - for(int i = 0; i < sizeof(dht); i++) { - outputJPEG(dht[i]); - } - } - m_output_desable = false; - } else if (m_mark == MARK_DHT) { - m_bDHT = true; - m_output_desable = false; - } else { - m_output_desable = false; - } - if (!m_output_desable) { - outputJPEG(0xff); - outputJPEG(m_mark); - outputJPEG((m_seg_len+2) >> 8); - outputJPEG((m_seg_len+2) & 0xff); - } - break; - case SEQ_SEG_BODY: - if (!m_output_desable) { - outputJPEG(c); - } - if (++m_seg_pos < m_seg_len) { - break; - } - if (m_mark == MARK_SOS) { - m_seq = SEQ_SOS; - break; - } - m_seq = SEQ_FRAME; - break; - case SEQ_SOS: - if (c == 0xff) { - m_seq = SEQ_SOS2; - break; - } - outputJPEG(c); - break; - case SEQ_SOS2: - if (c == 0x00) { - outputJPEG(0xff); - outputJPEG(0x00); - m_seq = SEQ_SOS; - break; - } else if (c >= MARK_RST0 && c <= MARK_RST7) { - outputJPEG(0xff); - outputJPEG(c); - m_seq = SEQ_SOS; - break; - } else if (c == MARK_EOI) { - outputJPEG(0xff); - outputJPEG(c, JPEG_END); - m_seq = SEQ_INIT; - break; - } else if (c == MARK_SOI) { - outputJPEG(0xff); - outputJPEG(c); - m_seq = SEQ_INIT; - break; - } - m_seq = SEQ_INIT; - break; - default: - m_seq = SEQ_INIT; - break; - } -}
--- a/KL46Z_USBHostC270/decodeMJPEG.h Fri Jan 31 13:50:15 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -// decodeMJPEG.h 2012/12/9 -#ifndef DECODE_MJPEG_H -#define DECODE_MJPEG_H - -#define JPEG_NONE 0 -#define JPEG_START 1 -#define JPEG_END 2 -#define JPEG_ERROR 3 - -class decodeMJPEG { -public: - decodeMJPEG(); - void inputPacket(const uint8_t* buf, int len); - virtual void outputJPEG(uint8_t c, int status = JPEG_NONE) = 0; -protected: - void input(uint8_t c); - int m_seq; - uint8_t m_mark; - uint16_t m_seg_pos; - uint16_t m_seg_len; - bool m_bDHT; - bool m_output_desable; -}; - -#endif // DECODE_MJPEG_H
--- a/main.cpp Fri Jan 31 13:50:15 2014 +0000 +++ b/main.cpp Tue Jun 10 07:35:46 2014 +0000 @@ -1,14 +1,32 @@ #include "USBHostCam.h" RawSerial pc(USBTX, USBRX); -DigitalOut led1(LED_GREEN); -DigitalOut led2(LED_RED); + +#if defined(TARGET_NUCLEO_F401RE) +uint8_t image_buf[1024*32]; +DigitalOut led1(LED1); +int led2 = 0; +#define LED_OFF 0 +#define LED_ON 1 + +#elif defined(TARGET_KL46Z) +uint8_t image_buf[1024*24]; +DigitalOut led1(LED1); +DigitalOut led2(LED2); #define LED_OFF 1 #define LED_ON 0 -#if defined(TARGET_KL46Z) -uint8_t image_buf[1024*24]; #elif defined(TARGET_KL25Z) uint8_t image_buf[1024*12]; +DigitalOut led1(LED1); +DigitalOut led2(LED2); +#define LED_OFF 1 +#define LED_ON 0 + +#elif defined(TARGET_LPC4088)||defined(TARGET_LPC1768) +#error "http://mbed.org/users/va009039/code/LPC4088-USBHostC270_example/" + +#else +#error "target error" #endif int main() { @@ -31,7 +49,7 @@ } switch(seq) { case 0: - pc.printf("\nReady, please download JPEG using XMODEM from FRDM-KL46Z.\n"); + pc.printf("\nReady, please download JPEG using XMODEM/Checksum.\n"); t.start(); seq++; break;
--- a/mbed.bld Fri Jan 31 13:50:15 2014 +0000 +++ b/mbed.bld Tue Jun 10 07:35:46 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/824293ae5e43 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/0b3ab51c8877 \ No newline at end of file