USB low speed packet capture

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers usbpkt.cpp Source File

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