Simple USBHost WebCam test program

Dependencies:   F401RE-USBHost mbed

Fork of KL46Z-USBHostC270_example by Norimasa Okamoto

WebカメラからJPEG画像を読み取るテストプログラムです。
使い方はKL46Z-USBHostC270_exampleと同じです。
動作確認カメラ: Logitech C270, Logitech C210, Logitech Q200R(Qcam Orbit AF), LifeCam VX-500
/media/uploads/va009039/f401re-c270-1.jpg /media/uploads/va009039/k64f-c270.jpg

Files at this revision

API Documentation at this revision

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

F401RE-USBHost.lib Show annotated file Show diff for this revision Revisions of this file
KL46Z-USBHost.lib Show diff for this revision Revisions of this file
KL46Z_USBHostC270/BaseUvc.cpp Show diff for this revision Revisions of this file
KL46Z_USBHostC270/BaseUvc.h Show diff for this revision Revisions of this file
KL46Z_USBHostC270/CamInfo.cpp Show diff for this revision Revisions of this file
KL46Z_USBHostC270/USBHostCam.cpp Show diff for this revision Revisions of this file
KL46Z_USBHostC270/USBHostCam.h Show diff for this revision Revisions of this file
KL46Z_USBHostC270/decodeMJPEG.cpp Show diff for this revision Revisions of this file
KL46Z_USBHostC270/decodeMJPEG.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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