BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Committer:
va009039
Date:
Wed Dec 05 13:25:18 2012 +0000
Revision:
1:80205a2de336
add LifeCamVX700

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:80205a2de336 1 // LifeCamVX700.cpp 2012/12/5
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 int rc = Control(GET_INFO, VS_PROBE_CONTROL, 1, buf, 1);
va009039 1:80205a2de336 30 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 31 DBG_BYTES("GET_INFO Prob", buf, 1);
va009039 1:80205a2de336 32
va009039 1:80205a2de336 33 rc = Control(GET_DEF, VS_PROBE_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 34 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 35 DBG_BYTES("GET_DEF Probe", buf, 26);
va009039 1:80205a2de336 36
va009039 1:80205a2de336 37 rc = Control(GET_MIN, VS_PROBE_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 38 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 39 DBG_BYTES("GET_MIN Probe", buf, 26);
va009039 1:80205a2de336 40
va009039 1:80205a2de336 41 rc = Control(GET_MAX, VS_PROBE_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 42 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 43 DBG_BYTES("GET_MAX Probe", buf, 26);
va009039 1:80205a2de336 44
va009039 1:80205a2de336 45 rc = Control(GET_CUR, VS_PROBE_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 46 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 47 DBG_BYTES("GET_CUR Probe", buf, 26);
va009039 1:80205a2de336 48
va009039 1:80205a2de336 49 memset(buf, 0, 26);
va009039 1:80205a2de336 50 buf[2] = VX700_MJPEG;
va009039 1:80205a2de336 51 buf[3] = frameIndex;
va009039 1:80205a2de336 52 *reinterpret_cast<uint32_t*>(buf+4) = interval;
va009039 1:80205a2de336 53
va009039 1:80205a2de336 54 DBG_BYTES("SET_CUR Commit", buf, 26);
va009039 1:80205a2de336 55 rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 56 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 57
va009039 1:80205a2de336 58 rc = Control(GET_CUR, VS_COMMIT_CONTROL, 1, buf, 26);
va009039 1:80205a2de336 59 TEST_ASSERT(rc == USB_OK);
va009039 1:80205a2de336 60 TEST_ASSERT_EQUAL(buf[2], VX700_MJPEG);
va009039 1:80205a2de336 61 TEST_ASSERT_EQUAL(buf[3], frameIndex);
va009039 1:80205a2de336 62 TEST_ASSERT_EQUAL(*reinterpret_cast<uint32_t*>(buf+4), interval);
va009039 1:80205a2de336 63 DBG_BYTES("GET_CUR Commit", buf, 26);
va009039 1:80205a2de336 64
va009039 1:80205a2de336 65 int cfg;
va009039 1:80205a2de336 66 rc = m_ctlEp->GetConfiguration(&cfg);
va009039 1:80205a2de336 67 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 68 DBG("config: %d\n", cfg);
va009039 1:80205a2de336 69
va009039 1:80205a2de336 70 rc = m_ctlEp->SetConfiguration(1);
va009039 1:80205a2de336 71 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 72
va009039 1:80205a2de336 73 rc = m_ctlEp->GetConfiguration(&cfg);
va009039 1:80205a2de336 74 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 75 DBG("config: %d\n", cfg);
va009039 1:80205a2de336 76 TEST_ASSERT_EQUAL(cfg, 1);
va009039 1:80205a2de336 77
va009039 1:80205a2de336 78 int alt;
va009039 1:80205a2de336 79 rc = m_ctlEp->GetInterface(1, &alt);
va009039 1:80205a2de336 80 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 81 DBG("alt: %d\n", alt);
va009039 1:80205a2de336 82
va009039 1:80205a2de336 83 rc = m_ctlEp->SetInterfaceAlternate(1, VX700_IF_ALT); // alt=1 packet size = 192
va009039 1:80205a2de336 84 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 85
va009039 1:80205a2de336 86 rc = m_ctlEp->GetInterface(1, &alt);
va009039 1:80205a2de336 87 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 1:80205a2de336 88 DBG("alt: %d\n", alt);
va009039 1:80205a2de336 89 TEST_ASSERT_EQUAL(alt, 1);
va009039 1:80205a2de336 90
va009039 1:80205a2de336 91 for(int i = 0; i < 16; i++) {
va009039 1:80205a2de336 92 report_cc_count[i] = 0;
va009039 1:80205a2de336 93 report_ps_cc_count[i] = 0;
va009039 1:80205a2de336 94 }
va009039 1:80205a2de336 95
va009039 1:80205a2de336 96 LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable
va009039 1:80205a2de336 97 LPC_USB->HcControl |= OR_CONTROL_IE; // IsochronousEnable
va009039 1:80205a2de336 98 }
va009039 1:80205a2de336 99
va009039 1:80205a2de336 100 bool LifeCamVX700::check(ControlEp* ctlEp)
va009039 1:80205a2de336 101 {
va009039 1:80205a2de336 102 if (ctlEp == NULL) {
va009039 1:80205a2de336 103 return false;
va009039 1:80205a2de336 104 }
va009039 1:80205a2de336 105 uint8_t buf[18];
va009039 1:80205a2de336 106 int r = ctlEp->GetDescriptor(1, 0, buf, 8);
va009039 1:80205a2de336 107 if (r != USB_OK) {
va009039 1:80205a2de336 108 return false;
va009039 1:80205a2de336 109 }
va009039 1:80205a2de336 110 DBG_HEX(buf, 8);
va009039 1:80205a2de336 111 const uint8_t desc[] = {0x12,0x01,0x00,0x02,0xef,0x02,0x01,0x40};
va009039 1:80205a2de336 112 if (memcmp(buf, desc, sizeof(desc)) != 0) {
va009039 1:80205a2de336 113 return false;
va009039 1:80205a2de336 114 }
va009039 1:80205a2de336 115 r = ctlEp->GetDescriptor(1, 0, buf, 18);
va009039 1:80205a2de336 116 if (r != USB_OK) {
va009039 1:80205a2de336 117 return false;
va009039 1:80205a2de336 118 }
va009039 1:80205a2de336 119 DBG_HEX(buf, 18);
va009039 1:80205a2de336 120 uint16_t vid = *reinterpret_cast<uint16_t*>(buf+8);
va009039 1:80205a2de336 121 uint16_t pid = *reinterpret_cast<uint16_t*>(buf+10);
va009039 1:80205a2de336 122 DBG("VID PID: %04X %04X\n", vid, pid);
va009039 1:80205a2de336 123 if (vid == VX700_VID && pid == VX700_PID) {
va009039 1:80205a2de336 124 return true;
va009039 1:80205a2de336 125 }
va009039 1:80205a2de336 126 return false;
va009039 1:80205a2de336 127 }
va009039 1:80205a2de336 128