Norimasa Okamoto
/
USBLowsCap
USB low speed packet capture
Embed:
(wiki syntax)
Show/hide line numbers
usbpkt.cpp
00001 // usbpkt.cpp 2013/4/29 00002 #include "usbpkt.h" 00003 00004 void usbpkt::reset() 00005 { 00006 _DEF_WIDTH = 7; 00007 _pre_value = 0; 00008 _data0 = 0; 00009 _data0_len = 0; 00010 _data = 0x00; 00011 _data_len = 0; 00012 _width = 0; 00013 _sync = false; 00014 00015 pktpos = 0; 00016 } 00017 00018 void usbpkt::inputByte(uint8_t value) 00019 { 00020 if (pktpos < MAX_PACKET_SIZE) { 00021 packet[pktpos++] = value; 00022 } 00023 } 00024 00025 void usbpkt::inputBit(int value) 00026 { 00027 _data0 >>= 1; 00028 if (value) { 00029 _data0 |= 0x80; 00030 } 00031 _data0_len++; 00032 if (!_sync) { 00033 if (_data0 == 0x80 && _data0_len >= 4) { 00034 inputByte(0x80); // SYNC 00035 _sync = true; 00036 } 00037 return; 00038 } 00039 if (_data0 == 0x7e) { // bit stuffing 00040 return; 00041 } 00042 _data >>= 1; 00043 if (value) { 00044 _data |= 0x80; 00045 } 00046 _data_len++; 00047 if (_data_len >= 8) { 00048 inputByte(_data); 00049 _data_len = 0; 00050 _data = 0x00; 00051 } 00052 } 00053 00054 void usbpkt::inputRaw(int value) 00055 { 00056 if (value != _pre_value) { 00057 inputBit(0); 00058 _width = 0; 00059 _pre_value = value; 00060 } else { 00061 _width++; 00062 if (_width >= (_DEF_WIDTH*3/2)) { 00063 _width -= _DEF_WIDTH; 00064 inputBit(1); 00065 } 00066 } 00067 } 00068 00069 void usbpkt::printHEX(FILE* fp) 00070 { 00071 for(int i = 0; i < pktpos; i++) { 00072 fprintf(fp, "[%02x]", packet[i]); 00073 } 00074 fprintf(fp, "\n"); 00075 } 00076 00077 void usbpkt::printUSB(FILE* fp) 00078 { 00079 const char* pidName[] = { 00080 "Reserved","OUT", "ACK", "DATA0", // 0-3 00081 "PING", "SOF", "NYET", "DATA2", // 4-7 00082 "SPLIT", "IN", "NAK", "DATA1", // 8-b 00083 "PRE", "SETUP","STALL", "MDATA", // a-f 00084 }; 00085 uint8_t pid = 0; 00086 for(int pos = 0; pos < pktpos; pos++) { 00087 uint8_t c = packet[pos]; 00088 if (pos == 0) { 00089 if (c == 0x80) { 00090 fprintf(fp, "[SYNC]"); 00091 } else { 00092 fprintf(fp,"[%02x]", c); 00093 } 00094 } else if (pos == 1) { 00095 pid = c & 0x0f; 00096 fprintf(fp, "[%s]", pidName[pid]); 00097 } else if (pos >= 2) { 00098 if (pid == 1 || pid == 4 || pid == 9 || pid == 0xd) { 00099 uint16_t u = packet[pos]|packet[pos+1]<<8; 00100 uint8_t addr = u&0x7f; 00101 uint8_t endp = (u>>7) & 0x0f; 00102 uint8_t crc5 = u>>11; 00103 fprintf(fp, "[ADDR=%02x][ENDP=%02x][CRC5=%02x]", addr, endp, crc5); 00104 break; 00105 } else if (pid == 3 || pid == 7 || pid == 0xb || pid == 0xf) { 00106 fprintf(fp, "["); 00107 for(int i = pos; i < pktpos-2; i++) { 00108 if (i == pos) { 00109 fprintf(fp, "%02x", packet[i]); 00110 } else { 00111 fprintf(fp, " %02x", packet[i]); 00112 } 00113 } 00114 uint16_t crc16 = packet[pktpos-2]|packet[pktpos-1]<<8; 00115 fprintf(fp, "][CRC16=%04x]", crc16); 00116 break; 00117 } else if (pid == 5) { 00118 uint16_t u = packet[pos]|packet[pos+1]<<8; 00119 uint16_t frame = u&0x3f; 00120 uint8_t crc5 = u>>11; 00121 fprintf(fp, "[frame=%04x][CRC5=%02x]", frame, crc5); 00122 break; 00123 } else { 00124 fprintf(fp, "[%02x]", packet[pos]); 00125 } 00126 } 00127 } 00128 fprintf(fp, "[EOP]\n"); 00129 } 00130
Generated on Thu Aug 18 2022 15:17:24 by 1.7.2