BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Committer:
va009039
Date:
Sun Jan 06 11:47:51 2013 +0000
Revision:
3:6ae9a03a6145
Parent:
2:c10029b87439
Child:
5:495f7536897b
update library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 3:6ae9a03a6145 1 // LogitechC270.cpp 2013/1/3
va009039 0:2a9734a95d55 2 #include "mbed.h"
va009039 0:2a9734a95d55 3 #include "rtos.h"
va009039 0:2a9734a95d55 4 #include "BaseUsbHost.h"
va009039 0:2a9734a95d55 5 #define DEBUG
va009039 0:2a9734a95d55 6 #include "BaseUsbHostDebug.h"
va009039 0:2a9734a95d55 7 #define TEST
va009039 0:2a9734a95d55 8 #include "BaseUsbHostTest.h"
va009039 0:2a9734a95d55 9 #include "LogitechC270.h"
va009039 0:2a9734a95d55 10
va009039 3:6ae9a03a6145 11 LogitechC270::LogitechC270(int formatIndex, int frameIndex, uint32_t interval, ControlEp* ctlEp)
va009039 0:2a9734a95d55 12 {
va009039 0:2a9734a95d55 13 uint8_t buf[26];
va009039 0:2a9734a95d55 14
va009039 0:2a9734a95d55 15 if (ctlEp == NULL) { // root hub
va009039 0:2a9734a95d55 16 DBG_OHCI(LPC_USB->HcRhPortStatus1);
va009039 0:2a9734a95d55 17 TEST_ASSERT_FALSE(LPC_USB->HcRhPortStatus1 & 0x200);
va009039 1:80205a2de336 18 ctlEp = new ControlEp();
va009039 1:80205a2de336 19 TEST_ASSERT_TRUE(ctlEp);
va009039 0:2a9734a95d55 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 0:2a9734a95d55 25 int addr = m_ctlEp->GetAddr();
va009039 1:80205a2de336 26 m_isoEp = new IsochronousEp(addr, C270_EN, C270_MPS);
va009039 0:2a9734a95d55 27 TEST_ASSERT_TRUE(m_isoEp);
va009039 0:2a9734a95d55 28
va009039 0:2a9734a95d55 29 int rc = Control(GET_INFO, VS_PROBE_CONTROL, 1, buf, 1);
va009039 0:2a9734a95d55 30 TEST_ASSERT(rc == USB_OK);
va009039 0:2a9734a95d55 31 DBG_BYTES("GET_INFO Prob", buf, 1);
va009039 0:2a9734a95d55 32
va009039 0:2a9734a95d55 33 rc = Control(GET_DEF, VS_PROBE_CONTROL, 1, buf, 26);
va009039 0:2a9734a95d55 34 TEST_ASSERT(rc == USB_OK);
va009039 0:2a9734a95d55 35 DBG_BYTES("GET_DEF Probe", buf, 26);
va009039 0:2a9734a95d55 36
va009039 0:2a9734a95d55 37 rc = Control(GET_MIN, VS_PROBE_CONTROL, 1, buf, 26);
va009039 0:2a9734a95d55 38 TEST_ASSERT(rc == USB_OK);
va009039 0:2a9734a95d55 39 DBG_BYTES("GET_MIN Probe", buf, 26);
va009039 0:2a9734a95d55 40
va009039 0:2a9734a95d55 41 rc = Control(GET_MAX, VS_PROBE_CONTROL, 1, buf, 26);
va009039 0:2a9734a95d55 42 TEST_ASSERT(rc == USB_OK);
va009039 0:2a9734a95d55 43 DBG_BYTES("GET_MAX Probe", buf, 26);
va009039 0:2a9734a95d55 44
va009039 0:2a9734a95d55 45 rc = Control(GET_CUR, VS_PROBE_CONTROL, 1, buf, 26);
va009039 0:2a9734a95d55 46 TEST_ASSERT(rc == USB_OK);
va009039 0:2a9734a95d55 47 DBG_BYTES("GET_CUR Probe", buf, 26);
va009039 0:2a9734a95d55 48
va009039 0:2a9734a95d55 49 memset(buf, 0, 26);
va009039 3:6ae9a03a6145 50 buf[2] = formatIndex;
va009039 1:80205a2de336 51 buf[3] = frameIndex;
va009039 0:2a9734a95d55 52 *reinterpret_cast<uint32_t*>(buf+4) = interval;
va009039 0:2a9734a95d55 53
va009039 0:2a9734a95d55 54 DBG_BYTES("SET_CUR Commit", buf, 26);
va009039 0:2a9734a95d55 55 rc = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, 26);
va009039 0:2a9734a95d55 56 TEST_ASSERT(rc == USB_OK);
va009039 0:2a9734a95d55 57
va009039 0:2a9734a95d55 58 rc = Control(GET_CUR, VS_COMMIT_CONTROL, 1, buf, 26);
va009039 0:2a9734a95d55 59 TEST_ASSERT(rc == USB_OK);
va009039 3:6ae9a03a6145 60 TEST_ASSERT_EQUAL(buf[2], formatIndex);
va009039 1:80205a2de336 61 TEST_ASSERT_EQUAL(buf[3], frameIndex);
va009039 0:2a9734a95d55 62 TEST_ASSERT_EQUAL(*reinterpret_cast<uint32_t*>(buf+4), interval);
va009039 0:2a9734a95d55 63 DBG_BYTES("GET_CUR Commit", buf, 26);
va009039 0:2a9734a95d55 64
va009039 2:c10029b87439 65 int value;
va009039 2:c10029b87439 66 rc = m_ctlEp->GetConfiguration(&value);
va009039 0:2a9734a95d55 67 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 2:c10029b87439 68 DBG("config: %d\n", value);
va009039 0:2a9734a95d55 69
va009039 0:2a9734a95d55 70 rc = m_ctlEp->SetConfiguration(1);
va009039 0:2a9734a95d55 71 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 0:2a9734a95d55 72
va009039 2:c10029b87439 73 rc = m_ctlEp->GetConfiguration(&value);
va009039 0:2a9734a95d55 74 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 2:c10029b87439 75 DBG("config: %d\n", value);
va009039 2:c10029b87439 76 TEST_ASSERT_EQUAL(value, 1);
va009039 0:2a9734a95d55 77
va009039 2:c10029b87439 78 rc = m_ctlEp->GetInterface(1, &value);
va009039 0:2a9734a95d55 79 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 2:c10029b87439 80 DBG("alt: %d\n", value);
va009039 0:2a9734a95d55 81
va009039 1:80205a2de336 82 rc = m_ctlEp->SetInterfaceAlternate(1, C270_IF_ALT); // alt=1 packet size = 192
va009039 0:2a9734a95d55 83 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 0:2a9734a95d55 84
va009039 2:c10029b87439 85 rc = m_ctlEp->GetInterface(1, &value);
va009039 0:2a9734a95d55 86 TEST_ASSERT_EQUAL(rc, USB_OK);
va009039 2:c10029b87439 87 DBG("alt: %d\n", value);
va009039 2:c10029b87439 88 TEST_ASSERT_EQUAL(value, C270_IF_ALT);
va009039 0:2a9734a95d55 89
va009039 0:2a9734a95d55 90 for(int i = 0; i < 16; i++) {
va009039 0:2a9734a95d55 91 report_cc_count[i] = 0;
va009039 0:2a9734a95d55 92 report_ps_cc_count[i] = 0;
va009039 0:2a9734a95d55 93 }
va009039 0:2a9734a95d55 94
va009039 0:2a9734a95d55 95 LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable
va009039 0:2a9734a95d55 96 LPC_USB->HcControl |= OR_CONTROL_IE; // IsochronousEnable
va009039 0:2a9734a95d55 97 }
va009039 0:2a9734a95d55 98
va009039 1:80205a2de336 99 bool LogitechC270::check(ControlEp* ctlEp)
va009039 0:2a9734a95d55 100 {
va009039 1:80205a2de336 101 if (ctlEp == NULL) {
va009039 1:80205a2de336 102 return false;
va009039 1:80205a2de336 103 }
va009039 1:80205a2de336 104 uint8_t buf[18];
va009039 1:80205a2de336 105 int r = ctlEp->GetDescriptor(1, 0, buf, 8);
va009039 1:80205a2de336 106 if (r != USB_OK) {
va009039 1:80205a2de336 107 return false;
va009039 1:80205a2de336 108 }
va009039 1:80205a2de336 109 DBG_HEX(buf, 8);
va009039 1:80205a2de336 110 const uint8_t desc[] = {0x12,0x01,0x00,0x02,0xef,0x02,0x01,0x40};
va009039 1:80205a2de336 111 if (memcmp(buf, desc, sizeof(desc)) != 0) {
va009039 1:80205a2de336 112 return false;
va009039 0:2a9734a95d55 113 }
va009039 1:80205a2de336 114 r = ctlEp->GetDescriptor(1, 0, buf, 18);
va009039 1:80205a2de336 115 if (r != USB_OK) {
va009039 1:80205a2de336 116 return false;
va009039 1:80205a2de336 117 }
va009039 1:80205a2de336 118 DBG_HEX(buf, 18);
va009039 1:80205a2de336 119 uint16_t vid = *reinterpret_cast<uint16_t*>(buf+8);
va009039 1:80205a2de336 120 uint16_t pid = *reinterpret_cast<uint16_t*>(buf+10);
va009039 1:80205a2de336 121 DBG("VID PID: %04X %04X\n", vid, pid);
va009039 1:80205a2de336 122 if (vid == C270_VID && pid == C270_PID) {
va009039 1:80205a2de336 123 return true;
va009039 1:80205a2de336 124 }
va009039 1:80205a2de336 125 return false;
va009039 0:2a9734a95d55 126 }