USB low speed packet capture

Dependencies:   mbed

Committer:
va009039
Date:
Mon Apr 29 08:11:31 2013 +0000
Revision:
0:654d7d47e816
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:654d7d47e816 1 // usbpkt.cpp 2013/4/29
va009039 0:654d7d47e816 2 #include "usbpkt.h"
va009039 0:654d7d47e816 3
va009039 0:654d7d47e816 4 void usbpkt::reset()
va009039 0:654d7d47e816 5 {
va009039 0:654d7d47e816 6 _DEF_WIDTH = 7;
va009039 0:654d7d47e816 7 _pre_value = 0;
va009039 0:654d7d47e816 8 _data0 = 0;
va009039 0:654d7d47e816 9 _data0_len = 0;
va009039 0:654d7d47e816 10 _data = 0x00;
va009039 0:654d7d47e816 11 _data_len = 0;
va009039 0:654d7d47e816 12 _width = 0;
va009039 0:654d7d47e816 13 _sync = false;
va009039 0:654d7d47e816 14
va009039 0:654d7d47e816 15 pktpos = 0;
va009039 0:654d7d47e816 16 }
va009039 0:654d7d47e816 17
va009039 0:654d7d47e816 18 void usbpkt::inputByte(uint8_t value)
va009039 0:654d7d47e816 19 {
va009039 0:654d7d47e816 20 if (pktpos < MAX_PACKET_SIZE) {
va009039 0:654d7d47e816 21 packet[pktpos++] = value;
va009039 0:654d7d47e816 22 }
va009039 0:654d7d47e816 23 }
va009039 0:654d7d47e816 24
va009039 0:654d7d47e816 25 void usbpkt::inputBit(int value)
va009039 0:654d7d47e816 26 {
va009039 0:654d7d47e816 27 _data0 >>= 1;
va009039 0:654d7d47e816 28 if (value) {
va009039 0:654d7d47e816 29 _data0 |= 0x80;
va009039 0:654d7d47e816 30 }
va009039 0:654d7d47e816 31 _data0_len++;
va009039 0:654d7d47e816 32 if (!_sync) {
va009039 0:654d7d47e816 33 if (_data0 == 0x80 && _data0_len >= 4) {
va009039 0:654d7d47e816 34 inputByte(0x80); // SYNC
va009039 0:654d7d47e816 35 _sync = true;
va009039 0:654d7d47e816 36 }
va009039 0:654d7d47e816 37 return;
va009039 0:654d7d47e816 38 }
va009039 0:654d7d47e816 39 if (_data0 == 0x7e) { // bit stuffing
va009039 0:654d7d47e816 40 return;
va009039 0:654d7d47e816 41 }
va009039 0:654d7d47e816 42 _data >>= 1;
va009039 0:654d7d47e816 43 if (value) {
va009039 0:654d7d47e816 44 _data |= 0x80;
va009039 0:654d7d47e816 45 }
va009039 0:654d7d47e816 46 _data_len++;
va009039 0:654d7d47e816 47 if (_data_len >= 8) {
va009039 0:654d7d47e816 48 inputByte(_data);
va009039 0:654d7d47e816 49 _data_len = 0;
va009039 0:654d7d47e816 50 _data = 0x00;
va009039 0:654d7d47e816 51 }
va009039 0:654d7d47e816 52 }
va009039 0:654d7d47e816 53
va009039 0:654d7d47e816 54 void usbpkt::inputRaw(int value)
va009039 0:654d7d47e816 55 {
va009039 0:654d7d47e816 56 if (value != _pre_value) {
va009039 0:654d7d47e816 57 inputBit(0);
va009039 0:654d7d47e816 58 _width = 0;
va009039 0:654d7d47e816 59 _pre_value = value;
va009039 0:654d7d47e816 60 } else {
va009039 0:654d7d47e816 61 _width++;
va009039 0:654d7d47e816 62 if (_width >= (_DEF_WIDTH*3/2)) {
va009039 0:654d7d47e816 63 _width -= _DEF_WIDTH;
va009039 0:654d7d47e816 64 inputBit(1);
va009039 0:654d7d47e816 65 }
va009039 0:654d7d47e816 66 }
va009039 0:654d7d47e816 67 }
va009039 0:654d7d47e816 68
va009039 0:654d7d47e816 69 void usbpkt::printHEX(FILE* fp)
va009039 0:654d7d47e816 70 {
va009039 0:654d7d47e816 71 for(int i = 0; i < pktpos; i++) {
va009039 0:654d7d47e816 72 fprintf(fp, "[%02x]", packet[i]);
va009039 0:654d7d47e816 73 }
va009039 0:654d7d47e816 74 fprintf(fp, "\n");
va009039 0:654d7d47e816 75 }
va009039 0:654d7d47e816 76
va009039 0:654d7d47e816 77 void usbpkt::printUSB(FILE* fp)
va009039 0:654d7d47e816 78 {
va009039 0:654d7d47e816 79 const char* pidName[] = {
va009039 0:654d7d47e816 80 "Reserved","OUT", "ACK", "DATA0", // 0-3
va009039 0:654d7d47e816 81 "PING", "SOF", "NYET", "DATA2", // 4-7
va009039 0:654d7d47e816 82 "SPLIT", "IN", "NAK", "DATA1", // 8-b
va009039 0:654d7d47e816 83 "PRE", "SETUP","STALL", "MDATA", // a-f
va009039 0:654d7d47e816 84 };
va009039 0:654d7d47e816 85 uint8_t pid = 0;
va009039 0:654d7d47e816 86 for(int pos = 0; pos < pktpos; pos++) {
va009039 0:654d7d47e816 87 uint8_t c = packet[pos];
va009039 0:654d7d47e816 88 if (pos == 0) {
va009039 0:654d7d47e816 89 if (c == 0x80) {
va009039 0:654d7d47e816 90 fprintf(fp, "[SYNC]");
va009039 0:654d7d47e816 91 } else {
va009039 0:654d7d47e816 92 fprintf(fp,"[%02x]", c);
va009039 0:654d7d47e816 93 }
va009039 0:654d7d47e816 94 } else if (pos == 1) {
va009039 0:654d7d47e816 95 pid = c & 0x0f;
va009039 0:654d7d47e816 96 fprintf(fp, "[%s]", pidName[pid]);
va009039 0:654d7d47e816 97 } else if (pos >= 2) {
va009039 0:654d7d47e816 98 if (pid == 1 || pid == 4 || pid == 9 || pid == 0xd) {
va009039 0:654d7d47e816 99 uint16_t u = packet[pos]|packet[pos+1]<<8;
va009039 0:654d7d47e816 100 uint8_t addr = u&0x7f;
va009039 0:654d7d47e816 101 uint8_t endp = (u>>7) & 0x0f;
va009039 0:654d7d47e816 102 uint8_t crc5 = u>>11;
va009039 0:654d7d47e816 103 fprintf(fp, "[ADDR=%02x][ENDP=%02x][CRC5=%02x]", addr, endp, crc5);
va009039 0:654d7d47e816 104 break;
va009039 0:654d7d47e816 105 } else if (pid == 3 || pid == 7 || pid == 0xb || pid == 0xf) {
va009039 0:654d7d47e816 106 fprintf(fp, "[");
va009039 0:654d7d47e816 107 for(int i = pos; i < pktpos-2; i++) {
va009039 0:654d7d47e816 108 if (i == pos) {
va009039 0:654d7d47e816 109 fprintf(fp, "%02x", packet[i]);
va009039 0:654d7d47e816 110 } else {
va009039 0:654d7d47e816 111 fprintf(fp, " %02x", packet[i]);
va009039 0:654d7d47e816 112 }
va009039 0:654d7d47e816 113 }
va009039 0:654d7d47e816 114 uint16_t crc16 = packet[pktpos-2]|packet[pktpos-1]<<8;
va009039 0:654d7d47e816 115 fprintf(fp, "][CRC16=%04x]", crc16);
va009039 0:654d7d47e816 116 break;
va009039 0:654d7d47e816 117 } else if (pid == 5) {
va009039 0:654d7d47e816 118 uint16_t u = packet[pos]|packet[pos+1]<<8;
va009039 0:654d7d47e816 119 uint16_t frame = u&0x3f;
va009039 0:654d7d47e816 120 uint8_t crc5 = u>>11;
va009039 0:654d7d47e816 121 fprintf(fp, "[frame=%04x][CRC5=%02x]", frame, crc5);
va009039 0:654d7d47e816 122 break;
va009039 0:654d7d47e816 123 } else {
va009039 0:654d7d47e816 124 fprintf(fp, "[%02x]", packet[pos]);
va009039 0:654d7d47e816 125 }
va009039 0:654d7d47e816 126 }
va009039 0:654d7d47e816 127 }
va009039 0:654d7d47e816 128 fprintf(fp, "[EOP]\n");
va009039 0:654d7d47e816 129 }
va009039 0:654d7d47e816 130