]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
added @piwi 's usb speed test.
authoriceman1001 <iceman@iuse.se>
Fri, 31 Jul 2015 08:37:24 +0000 (10:37 +0200)
committericeman1001 <iceman@iuse.se>
Fri, 31 Jul 2015 08:37:24 +0000 (10:37 +0200)
.. found out that my usb speed is really slow.  Started to look for reasons. Have a win7 64 env, running on a vmware image.

armsrc/appmain.c
armsrc/util.c
client/cmdhw.c
client/cmdmain.c
client/flash.c
client/lualibs/commands.lua
client/uart.c
common/usb_cdc.c

index 3dcf48cc30ccb9a5dba093c5fdcaca5e60da0e5b..2e1a43afc40dd3dca27479bdbe0a3de3978cb506 100644 (file)
@@ -298,18 +298,49 @@ void SendVersion(void)
        uint32_t compressed_data_section_size = common_area.arg1;
        cmd_send(CMD_ACK, *(AT91C_DBGU_CIDR), text_and_rodata_section_size + compressed_data_section_size, 0, VersionString, strlen(VersionString));
 }
        uint32_t compressed_data_section_size = common_area.arg1;
        cmd_send(CMD_ACK, *(AT91C_DBGU_CIDR), text_and_rodata_section_size + compressed_data_section_size, 0, VersionString, strlen(VersionString));
 }
+
+// measure the USB Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time.
+// Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the UsbCommand structure included.
+void printUSBSpeed(uint32_t SpeedTestBufferSize) 
+{
+       Dbprintf("USB Speed:");
+       Dbprintf("  Sending %d bytes payload...", SpeedTestBufferSize);
+
+       uint8_t *test_data = BigBuf_get_addr();
+
+       uint32_t start_time = GetTickCount();
+
+       LED_B_ON();
+       for(size_t i=0; i < SpeedTestBufferSize; i += USB_CMD_DATA_SIZE) {
+               size_t len = MIN((SpeedTestBufferSize - i), USB_CMD_DATA_SIZE);
+               cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K,0,len,0,test_data,len);
+       }
+       LED_B_OFF();
+
+       uint32_t end_time = GetTickCount();
+
+       Dbprintf("  Time elapsed: %dms, USB Transfer Speed PM3 -> Client = %d Bytes/s", 
+               end_time - start_time,
+               1000* SpeedTestBufferSize / (end_time - start_time));
+
+}
+       
 /**
   * Prints runtime information about the PM3.
 **/
 /**
   * Prints runtime information about the PM3.
 **/
-void SendStatus(void)
+void SendStatus(uint32_t SpeedTestBufferSize)
 {
        BigBuf_print_status();
        Fpga_print_status();
        printConfig(); //LF Sampling config
 {
        BigBuf_print_status();
        Fpga_print_status();
        printConfig(); //LF Sampling config
+       printUSBSpeed(SpeedTestBufferSize);
        Dbprintf("Various");
        Dbprintf("Various");
-       Dbprintf("  MF_DBGLEVEL......%d", MF_DBGLEVEL);
-       Dbprintf("  ToSendMax........%d",ToSendMax);
-       Dbprintf("  ToSendBit........%d",ToSendBit);
+       Dbprintf("  MF_DBGLEVEL........%d", MF_DBGLEVEL);
+       Dbprintf("  ToSendMax..........%d", ToSendMax);
+       Dbprintf("  ToSendBit..........%d", ToSendBit);
+       Dbprintf("  ToSend BUFFERSIZE..%d", TOSEND_BUFFER_SIZE);
+
+       cmd_send(CMD_ACK,1,0,0,0,0);
 }
 
 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF)
 }
 
 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF)
@@ -1168,7 +1199,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        ReaderIClass(c->arg[0]);
                        break;
                case CMD_READER_ICLASS_REPLAY:
                        ReaderIClass(c->arg[0]);
                        break;
                case CMD_READER_ICLASS_REPLAY:
-                       ReaderIClass_Replay(c->arg[0], c->d.asBytes);
+                   ReaderIClass_Replay(c->arg[0], c->d.asBytes);
                        break;
        case CMD_ICLASS_EML_MEMSET:
                        emlSet(c->d.asBytes,c->arg[0], c->arg[1]);
                        break;
        case CMD_ICLASS_EML_MEMSET:
                        emlSet(c->d.asBytes,c->arg[0], c->arg[1]);
@@ -1238,7 +1269,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
                        SendVersion();
                        break;
                case CMD_STATUS:
                        SendVersion();
                        break;
                case CMD_STATUS:
-                       SendStatus();
+                       SendStatus(c->arg[0]);
                        break;
                case CMD_PING:
                        cmd_send(CMD_ACK,0,0,0,0,0);
                        break;
                case CMD_PING:
                        cmd_send(CMD_ACK,0,0,0,0,0);
@@ -1255,8 +1286,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
                case CMD_FINISH_WRITE:
                case CMD_HARDWARE_RESET:
                        usb_disable();
                case CMD_FINISH_WRITE:
                case CMD_HARDWARE_RESET:
                        usb_disable();
-                       SpinDelay(1000);
-                       SpinDelay(1000);
+                       SpinDelay(2000);
                        AT91C_BASE_RSTC->RSTC_RCR = RST_CONTROL_KEY | AT91C_RSTC_PROCRST;
                        for(;;) {
                                // We're going to reset, and the bootrom will take control.
                        AT91C_BASE_RSTC->RSTC_RCR = RST_CONTROL_KEY | AT91C_RSTC_PROCRST;
                        for(;;) {
                                // We're going to reset, and the bootrom will take control.
@@ -1328,7 +1358,7 @@ void  __attribute__((noreturn)) AppMain(void)
        LCDInit();
 #endif
 
        LCDInit();
 #endif
 
-  byte_t rx[sizeof(UsbCommand)];
+       byte_t rx[sizeof(UsbCommand)];
        size_t rx_len;
   
        for(;;) {
        size_t rx_len;
   
        for(;;) {
index 8576ddce5fcb7c641236d214bb224ca3221769b1..1dd8dc7544fe1cb2989548692f8449f19b6ca621 100644 (file)
@@ -304,11 +304,12 @@ void FormatVersionInformation(char *dst, int len, const char *prefix, void *vers
 
 void StartTickCount()
 {
 
 void StartTickCount()
 {
-//  must be 0x40, but on my cpu - included divider is optimal
-//  0x20 - 1 ms / bit 
-//  0x40 - 2 ms / bit
-
-       AT91C_BASE_RTTC->RTTC_RTMR = AT91C_RTTC_RTTRST + 0x001D; // was 0x003B
+       // This timer is based on the slow clock. The slow clock frequency is between 22kHz and 40kHz.
+       // We can determine the actual slow clock frequency by looking at the Main Clock Frequency Register.
+    uint16_t mainf = AT91C_BASE_PMC->PMC_MCFR & 0xffff;                // = 16 * main clock frequency (16MHz) / slow clock frequency
+       // set RealTimeCounter divider to count at 1kHz:
+       AT91C_BASE_RTTC->RTTC_RTMR = AT91C_RTTC_RTTRST | ((256000 + (mainf/2)) / mainf);
+       // note: worst case precision is approx 2.5%
 }
 
 /*
 }
 
 /*
index 5f25241cafe1f91a80e1cc2a41c8936511901d52..16be8bbe7f49db15bd9a2a7200ad01bdf446ac83 100644 (file)
@@ -18,6 +18,7 @@
 #include "cmdhw.h"
 #include "cmdmain.h"
 #include "cmddata.h"
 #include "cmdhw.h"
 #include "cmdmain.h"
 #include "cmddata.h"
+#include "data.h"
 
 /* low-level hardware control */
 
 
 /* low-level hardware control */
 
@@ -404,18 +405,17 @@ int CmdTune(const char *Cmd)
 
 int CmdVersion(const char *Cmd)
 {
 
 int CmdVersion(const char *Cmd)
 {
-
        clearCommandBuffer();
        clearCommandBuffer();
-  UsbCommand c = {CMD_VERSION};
+       UsbCommand c = {CMD_VERSION};
        static UsbCommand resp = {0, {0, 0, 0}};
 
        if (resp.arg[0] == 0 && resp.arg[1] == 0) { // no cached information available
        static UsbCommand resp = {0, {0, 0, 0}};
 
        if (resp.arg[0] == 0 && resp.arg[1] == 0) { // no cached information available
-  SendCommand(&c);
-       if (WaitForResponseTimeout(CMD_ACK,&resp,1000)) {
-               PrintAndLog("Prox/RFID mark3 RFID instrument");
-               PrintAndLog((char*)resp.d.asBytes);
-               lookupChipID(resp.arg[0], resp.arg[1]);
-       }
+               SendCommand(&c);
+               if (WaitForResponseTimeout(CMD_ACK,&resp,1000)) {
+                       PrintAndLog("Prox/RFID mark3 RFID instrument");
+                       PrintAndLog((char*)resp.d.asBytes);
+                       lookupChipID(resp.arg[0], resp.arg[1]);
+               }
        } else {
                PrintAndLog("[[[ Cached information ]]]\n");
                PrintAndLog("Prox/RFID mark3 RFID instrument");
        } else {
                PrintAndLog("[[[ Cached information ]]]\n");
                PrintAndLog("Prox/RFID mark3 RFID instrument");
@@ -428,11 +428,21 @@ int CmdVersion(const char *Cmd)
 
 int CmdStatus(const char *Cmd)
 {
 
 int CmdStatus(const char *Cmd)
 {
-       UsbCommand c = {CMD_STATUS};
+       uint8_t speed_test_buffer[USB_CMD_DATA_SIZE];
+       sample_buf = speed_test_buffer;
+       #define USB_SPEED_TEST_SIZE (100*USB_CMD_DATA_SIZE)
+
+       clearCommandBuffer();
+       UsbCommand c = {CMD_STATUS, {USB_SPEED_TEST_SIZE}};
        SendCommand(&c);
        SendCommand(&c);
+       UsbCommand resp;
+       if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) {
+               PrintAndLog("Status command failed. USB Speed Test timed out");
+       }
        return 0;
 }
 
        return 0;
 }
 
+
 int CmdPing(const char *Cmd)
 {
        clearCommandBuffer();
 int CmdPing(const char *Cmd)
 {
        clearCommandBuffer();
index 377fdc2ce4e399cea3087968489415ce18550df7..401e50fa6f6a6ce607f916d9ff3d7cec55cdb04e 100644 (file)
@@ -145,27 +145,27 @@ int getCommand(UsbCommand* response)
  */
 bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout) {
   
  */
 bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout) {
   
-  UsbCommand resp;
-       
+       UsbCommand resp;
+
        if (response == NULL)
        if (response == NULL)
-    response = &resp;
+               response = &resp;
 
 
 
 
-  // Wait until the command is received
-  for(size_t dm_seconds=0; dm_seconds < ms_timeout/10; dm_seconds++) {
+       // Wait until the command is received
+       for(size_t dm_seconds=0; dm_seconds < ms_timeout/10; dm_seconds++) {
 
                while(getCommand(response)) {
 
                while(getCommand(response)) {
-          if(response->cmd == cmd){
-          return true;
-          }
-      }
-        msleep(10); // XXX ugh
-        if (dm_seconds == 200) { // Two seconds elapsed
-          PrintAndLog("Waiting for a response from the proxmark...");
-          PrintAndLog("Don't forget to cancel its operation first by pressing on the button");
-        }
+                       if(response->cmd == cmd){
+                               return true;
+                       }
+               }
+               msleep(10); // XXX ugh
+               if (dm_seconds == 200) { // Two seconds elapsed
+                       PrintAndLog("Waiting for a response from the proxmark...");
+                       PrintAndLog("Don't forget to cancel its operation first by pressing on the button");
+               }
        }
        }
-    return false;
+       return false;
 }
 
 bool WaitForResponse(uint32_t cmd, UsbCommand* response) {
 }
 
 bool WaitForResponse(uint32_t cmd, UsbCommand* response) {
@@ -208,7 +208,6 @@ void UsbCommandReceived(UsbCommand *UC)
                default:
                        break;
        }
                default:
                        break;
        }
-
        storeCommand(UC);
 }
 
        storeCommand(UC);
 }
 
index d2163d9a0c1334c6f6636c27a5bb88005adacde9..576f0d27a340a0e7cb648672a7483e9322d84fa8 100644 (file)
@@ -276,7 +276,7 @@ static int get_proxmark_state(uint32_t *state)
 {
        UsbCommand c;
        c.cmd = CMD_DEVICE_INFO;
 {
        UsbCommand c;
        c.cmd = CMD_DEVICE_INFO;
-  SendCommand(&c);
+       SendCommand(&c);
        UsbCommand resp;
        ReceiveCommand(&resp);
 
        UsbCommand resp;
        ReceiveCommand(&resp);
 
index 2f4a7ea3a44443815fe15618ab95a11e13d53295..fdc2b18d0ecb9ebed643cbb8cfc2c7ed7baa5a7c 100644 (file)
@@ -154,10 +154,10 @@ local _commands = {
 
 
 local _reverse_lookup,k,v = {}
 
 
 local _reverse_lookup,k,v = {}
-       for k, v in pairs(_commands) do
-               _reverse_lookup[v] =  k
-       end
-       _commands.tostring = function(command)
+for k, v in pairs(_commands) do
+       _reverse_lookup[v] =  k
+end
+_commands.tostring = function(command)
        if(type(command) == 'number') then
                return ("%s (%d)"):format(_reverse_lookup[command]or "ERROR UNDEFINED!", command) 
        end
        if(type(command) == 'number') then
                return ("%s (%d)"):format(_reverse_lookup[command]or "ERROR UNDEFINED!", command) 
        end
@@ -173,7 +173,6 @@ Command = {
                self.__index = self
 
                o.cmd = o.cmd or _commands.CMD_UNKNOWN
                self.__index = self
 
                o.cmd = o.cmd or _commands.CMD_UNKNOWN
-               --o.arg1 = "test"
                o.arg1 = o.arg1 or 0
                o.arg2 = o.arg2 or 0
                o.arg3 = o.arg3 or 0 
                o.arg1 = o.arg1 or 0
                o.arg2 = o.arg2 or 0
                o.arg3 = o.arg3 or 0 
@@ -195,14 +194,14 @@ Command = {
                else 
                        print(("WARNING; data was NOT a (hex-) string, but was %s"):format(type(data)))
                end
                else 
                        print(("WARNING; data was NOT a (hex-) string, but was %s"):format(type(data)))
                end
-               o.data = data
-               
+               o.data = data   
                return o
        end,
                return o
        end,
-       parse = function (packet)
-               local count,cmd,arg1,arg2,arg3,data = bin.unpack('LLLLH512',packet)
+       parse = function(packet)
+               local count, cmd, arg1, arg2, arg3, data = bin.unpack('LLLLH512', packet)
                return Command:new{cmd = cmd, arg1 = arg1, arg2 = arg2, arg3 = arg3, data = data}
                return Command:new{cmd = cmd, arg1 = arg1, arg2 = arg2, arg3 = arg3, data = data}
-       end,
+       end
+
 }
 function Command:__tostring()
        local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format(
 }
 function Command:__tostring()
        local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format(
index 4b2fee994f533d0044c729f36ce01690c113a8aa..e3a6a57b7b68f16e77fb095ee3a79d2ee64fec5b 100644 (file)
@@ -370,9 +370,9 @@ serial_port uart_open(const char* pcPortName) {
   memset(&sp->dcb, 0, sizeof(DCB));
   sp->dcb.DCBlength = sizeof(DCB);
   if(!BuildCommDCBA("baud=9600 data=8 parity=N stop=1",&sp->dcb)) {
   memset(&sp->dcb, 0, sizeof(DCB));
   sp->dcb.DCBlength = sizeof(DCB);
   if(!BuildCommDCBA("baud=9600 data=8 parity=N stop=1",&sp->dcb)) {
-    uart_close(sp);
-    return INVALID_SERIAL_PORT;
-  }
+               uart_close(sp);
+               return INVALID_SERIAL_PORT;
+       }
   
   // Update the active serial port
   if(!SetCommState(sp->hPort,&sp->dcb)) {
   
   // Update the active serial port
   if(!SetCommState(sp->hPort,&sp->dcb)) {
index 3c6e928238d11b285e66375ce1ffff2bb28946e2..b413523cd846848a1b81eb24a4a11f7aabde13a4 100644 (file)
@@ -235,31 +235,32 @@ void usb_disable() {
 //* \brief This function Activates the USB device\r
 //*----------------------------------------------------------------------------\r
 void usb_enable() {\r
 //* \brief This function Activates the USB device\r
 //*----------------------------------------------------------------------------\r
 void usb_enable() {\r
-  // Set the PLL USB Divider\r
-  AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1 ;\r
-  \r
-  // Specific Chip USB Initialisation\r
-  // Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock\r
-  AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;\r
-  AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);\r
-  \r
-  // Enable UDP PullUp (USB_DP_PUP) : enable & Clear of the corresponding PIO\r
-  // Set in PIO mode and Configure in Output\r
-  AT91C_BASE_PIOA->PIO_PER = GPIO_USB_PU; // Set in PIO mode\r
+       // Set the PLL USB Divider\r
+       AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1 ;\r
+\r
+       // Specific Chip USB Initialisation\r
+       // Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock\r
+       AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;\r
+       AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);\r
+\r
+       // Enable UDP PullUp (USB_DP_PUP) : enable & Clear of the corresponding PIO\r
+       // Set in PIO mode and Configure in Output\r
+       AT91C_BASE_PIOA->PIO_PER = GPIO_USB_PU; // Set in PIO mode\r
        AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU; // Configure as Output\r
        AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU; // Configure as Output\r
-  \r
-  // Clear for set the Pullup resistor\r
+\r
+       // Clear for set the Pullup resistor\r
        AT91C_BASE_PIOA->PIO_CODR = GPIO_USB_PU;\r
        AT91C_BASE_PIOA->PIO_CODR = GPIO_USB_PU;\r
-  \r
-  // Disconnect and reconnect USB controller for 100ms\r
-  usb_disable();\r
-  \r
-  // Wait for a short while\r
-  for (volatile size_t i=0; i<0x100000; i++);\r
 \r
 \r
-  // Reconnect USB reconnect\r
-  AT91C_BASE_PIOA->PIO_SODR = GPIO_USB_PU;\r
-  AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU;\r
+       // Disconnect and reconnect USB controller for 100ms\r
+       usb_disable();\r
+\r
+       // Wait for a short while\r
+       for (volatile size_t i=0; i<0x100000; i++);\r
+    //sleep(1);\r
+       \r
+       // Reconnect USB reconnect\r
+       AT91C_BASE_PIOA->PIO_SODR = GPIO_USB_PU;\r
+       AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU;\r
 }\r
 \r
 //*----------------------------------------------------------------------------\r
 }\r
 \r
 //*----------------------------------------------------------------------------\r
Impressum, Datenschutz