BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Committer:
va009039
Date:
Tue Dec 11 15:28:00 2012 +0000
Revision:
2:c10029b87439
Parent:
LifeCamVX700.cpp@1:80205a2de336
add example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:c10029b87439 1 // LifeCamVX700.cpp 2012/12/10
va009039 1:80205a2de336 2 #include "mbed.h"
va009039 1:80205a2de336 3 #include "rtos.h"
va009039 1:80205a2de336 4 #include "BaseUsbHost.h"
va009039 1:80205a2de336 5 #define DEBUG
va009039 1:80205a2de336 6 #include "BaseUsbHostDebug.h"
va009039 1:80205a2de336 7 #define TEST
va009039 1:80205a2de336 8 #include "BaseUsbHostTest.h"
va009039 1:80205a2de336 9 #include "LifeCamVX700.h"
va009039 1:80205a2de336 10
va009039 1:80205a2de336 11 LifeCamVX700::LifeCamVX700(int frameIndex, uint32_t interval, ControlEp* ctlEp)
va009039 1:80205a2de336 12 {
va009039 1:80205a2de336 13 uint8_t buf[26];
va009039 1:80205a2de336 14
va009039 1:80205a2de336 15 if (ctlEp == NULL) { // root hub
va009039 1:80205a2de336 16 DBG_OHCI(LPC_USB->HcRhPortStatus1);
va009039 1:80205a2de336 17 TEST_ASSERT_FALSE(LPC_USB->HcRhPortStatus1 & 0x200);
va009039 1:80205a2de336 18 ctlEp = new ControlEp();
va009039 1:80205a2de336 19 TEST_ASSERT_TRUE(ctlEp);
va009039 1:80205a2de336 20 }
va009039 1:80205a2de336 21 bool r = check(ctlEp);
va009039 1:80205a2de336 22 TEST_ASSERT(r);
va009039 1:80205a2de336 23 m_ctlEp = ctlEp;
va009039 1:80205a2de336 24
va009039 1:80205a2de336 25 int addr = m_ctlEp->GetAddr();
va009039 1:80205a2de336 26 m_isoEp = new IsochronousEp(addr, VX700_EN, VX700_MPS);
va009039 1:80205a2de336 27 TEST_ASSERT_TRUE(m_isoEp);
va009039 1:80205a2de336 28
va009039 1:80205a2de336 29 memset(buf, 0, 26);
va009039 1:80205a2de336 30 buf[2] = VX700_MJPEG;
va009039 1:80205a2de336 31 buf[3] = frameIndex;
va009039 1:80205a2de336 32 *reinterpret_cast<uint32_t*>(buf+4) = interval;
va009039 1:80205a2de336 33
va009039 1:80205a2de336 34 DBG_BYTES("SET_CUR Commit", buf, 26);
va009039 2:c10029b87439 35 int rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 36 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 37
va009039 1:80205a2de336 38 rc = Control(GET_CUR, VS_COMMIT_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 39 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 40 TEST_ASSERT_EQUAL(buf[2], VX700_MJPEG);
va009039 1:80205a2de336 41 TEST_ASSERT_EQUAL(buf[3], frameIndex);
va009039 1:80205a2de336 42 TEST_ASSERT_EQUAL(*reinterpret_cast<uint32_t*>(buf+4), interval);
va009039 1:80205a2de336 43 DBG_BYTES("GET_CUR Commit", buf, 26);
va009039 1:80205a2de336 44
va009039 1:80205a2de336 45 rc = m_ctlEp->SetConfiguration(1);
va009039 1:80205a2de336 46 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 47
va009039 2:c10029b87439 48 int value;
va009039 2:c10029b87439 49 rc = m_ctlEp->GetConfiguration(&value);
va009039 1:80205a2de336 50 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 2:c10029b87439 51 DBG("config: %d\n", value);
va009039 2:c10029b87439 52 TEST_ASSERT_EQUAL(value, 1);
va009039 1:80205a2de336 53
va009039 1:80205a2de336 54 rc = m_ctlEp->SetInterfaceAlternate(1, VX700_IF_ALT); // alt=1 packet size = 192
va009039 1:80205a2de336 55 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 56
va009039 2:c10029b87439 57 rc = m_ctlEp->GetInterface(1, &value);
va009039 1:80205a2de336 58 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 2:c10029b87439 59 DBG("alt: %d\n", value);
va009039 2:c10029b87439 60 TEST_ASSERT_EQUAL(value, 1);
va009039 1:80205a2de336 61
va009039 1:80205a2de336 62 for(int i = 0; i < 16; i++) {
va009039 1:80205a2de336 63 report_cc_count[i] = 0;
va009039 1:80205a2de336 64 report_ps_cc_count[i] = 0;
va009039 1:80205a2de336 65 }
va009039 1:80205a2de336 66
va009039 1:80205a2de336 67 LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable
va009039 1:80205a2de336 68 LPC_USB->HcControl |= OR_CONTROL_IE; // IsochronousEnable
va009039 1:80205a2de336 69 }
va009039 1:80205a2de336 70
va009039 1:80205a2de336 71 bool LifeCamVX700::check(ControlEp* ctlEp)
va009039 1:80205a2de336 72 {
va009039 1:80205a2de336 73 if (ctlEp == NULL) {
va009039 1:80205a2de336 74 return false;
va009039 1:80205a2de336 75 }
va009039 1:80205a2de336 76 uint8_t buf[18];
va009039 1:80205a2de336 77 int r = ctlEp->GetDescriptor(1, 0, buf, 8);
va009039 1:80205a2de336 78 if (r != USB_OK) {
va009039 1:80205a2de336 79 return false;
va009039 1:80205a2de336 80 }
va009039 1:80205a2de336 81 DBG_HEX(buf, 8);
va009039 1:80205a2de336 82 const uint8_t desc[] = {0x12,0x01,0x00,0x02,0xef,0x02,0x01,0x40};
va009039 1:80205a2de336 83 if (memcmp(buf, desc, sizeof(desc)) != 0) {
va009039 1:80205a2de336 84 return false;
va009039 1:80205a2de336 85 }
va009039 1:80205a2de336 86 r = ctlEp->GetDescriptor(1, 0, buf, 18);
va009039 1:80205a2de336 87 if (r != USB_OK) {
va009039 1:80205a2de336 88 return false;
va009039 1:80205a2de336 89 }
va009039 1:80205a2de336 90 DBG_HEX(buf, 18);
va009039 1:80205a2de336 91 uint16_t vid = *reinterpret_cast<uint16_t*>(buf+8);
va009039 1:80205a2de336 92 uint16_t pid = *reinterpret_cast<uint16_t*>(buf+10);
va009039 1:80205a2de336 93 DBG("VID PID: %04X %04X\n", vid, pid);
va009039 1:80205a2de336 94 if (vid == VX700_VID && pid == VX700_PID) {
va009039 1:80205a2de336 95 return true;
va009039 1:80205a2de336 96 }
va009039 1:80205a2de336 97 return false;
va009039 1:80205a2de336 98 }
va009039 1:80205a2de336 99