BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
LifeCamVX700/LifeCamVX700.cpp@2:c10029b87439, 2012-12-11 (annotated)
- 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?
User | Revision | Line number | New 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 |