BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
LogitechC270/LogitechC270.cpp@3:6ae9a03a6145, 2013-01-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |