BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

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?

UserRevisionLine numberNew 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