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