From f62b5e1204517129be388dbdbf8041337dea53f0 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 31 Jul 2015 10:37:24 +0200 Subject: [PATCH] added @piwi 's usb speed test. .. 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 | 48 ++++++++++++++++++++++++++++++------- armsrc/util.c | 11 +++++---- client/cmdhw.c | 28 +++++++++++++++------- client/cmdmain.c | 31 ++++++++++++------------ client/flash.c | 2 +- client/lualibs/commands.lua | 19 +++++++-------- client/uart.c | 6 ++--- common/usb_cdc.c | 45 +++++++++++++++++----------------- 8 files changed, 115 insertions(+), 75 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 3dcf48cc..2e1a43af 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -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)); } + +// 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. **/ -void SendStatus(void) +void SendStatus(uint32_t SpeedTestBufferSize) { BigBuf_print_status(); Fpga_print_status(); printConfig(); //LF Sampling config + printUSBSpeed(SpeedTestBufferSize); 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) @@ -1168,7 +1199,7 @@ void UsbPacketReceived(uint8_t *packet, int len) 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]); @@ -1238,7 +1269,7 @@ void UsbPacketReceived(uint8_t *packet, int len) SendVersion(); break; case CMD_STATUS: - SendStatus(); + SendStatus(c->arg[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(); - 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. @@ -1328,7 +1358,7 @@ void __attribute__((noreturn)) AppMain(void) LCDInit(); #endif - byte_t rx[sizeof(UsbCommand)]; + byte_t rx[sizeof(UsbCommand)]; size_t rx_len; for(;;) { diff --git a/armsrc/util.c b/armsrc/util.c index 8576ddce..1dd8dc75 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -304,11 +304,12 @@ void FormatVersionInformation(char *dst, int len, const char *prefix, void *vers 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% } /* diff --git a/client/cmdhw.c b/client/cmdhw.c index 5f25241c..16be8bbe 100644 --- a/client/cmdhw.c +++ b/client/cmdhw.c @@ -18,6 +18,7 @@ #include "cmdhw.h" #include "cmdmain.h" #include "cmddata.h" +#include "data.h" /* low-level hardware control */ @@ -404,18 +405,17 @@ int CmdTune(const char *Cmd) int CmdVersion(const char *Cmd) { - 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 - 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"); @@ -428,11 +428,21 @@ int CmdVersion(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); + UsbCommand resp; + if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { + PrintAndLog("Status command failed. USB Speed Test timed out"); + } return 0; } + int CmdPing(const char *Cmd) { clearCommandBuffer(); diff --git a/client/cmdmain.c b/client/cmdmain.c index 377fdc2c..401e50fa 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -145,27 +145,27 @@ int getCommand(UsbCommand* response) */ bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout) { - UsbCommand resp; - + UsbCommand resp; + 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)) { - 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) { @@ -208,7 +208,6 @@ void UsbCommandReceived(UsbCommand *UC) default: break; } - storeCommand(UC); } diff --git a/client/flash.c b/client/flash.c index d2163d9a..576f0d27 100644 --- a/client/flash.c +++ b/client/flash.c @@ -276,7 +276,7 @@ static int get_proxmark_state(uint32_t *state) { UsbCommand c; c.cmd = CMD_DEVICE_INFO; - SendCommand(&c); + SendCommand(&c); UsbCommand resp; ReceiveCommand(&resp); diff --git a/client/lualibs/commands.lua b/client/lualibs/commands.lua index 2f4a7ea3..fdc2b18d 100644 --- a/client/lualibs/commands.lua +++ b/client/lualibs/commands.lua @@ -154,10 +154,10 @@ local _commands = { 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 @@ -173,7 +173,6 @@ Command = { 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 @@ -195,14 +194,14 @@ Command = { 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, - 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} - end, + end + } function Command:__tostring() local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format( diff --git a/client/uart.c b/client/uart.c index 4b2fee99..e3a6a57b 100644 --- a/client/uart.c +++ b/client/uart.c @@ -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)) { - 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)) { diff --git a/common/usb_cdc.c b/common/usb_cdc.c index 3c6e9282..b413523c 100644 --- a/common/usb_cdc.c +++ b/common/usb_cdc.c @@ -235,31 +235,32 @@ void usb_disable() { //* \brief This function Activates the USB device //*---------------------------------------------------------------------------- void usb_enable() { - // Set the PLL USB Divider - AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1 ; - - // Specific Chip USB Initialisation - // Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock - AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP); - - // Enable UDP PullUp (USB_DP_PUP) : enable & Clear of the corresponding PIO - // Set in PIO mode and Configure in Output - AT91C_BASE_PIOA->PIO_PER = GPIO_USB_PU; // Set in PIO mode + // Set the PLL USB Divider + AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1 ; + + // Specific Chip USB Initialisation + // Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock + AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; + AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP); + + // Enable UDP PullUp (USB_DP_PUP) : enable & Clear of the corresponding PIO + // Set in PIO mode and Configure in Output + AT91C_BASE_PIOA->PIO_PER = GPIO_USB_PU; // Set in PIO mode AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU; // Configure as Output - - // Clear for set the Pullup resistor + + // Clear for set the Pullup resistor AT91C_BASE_PIOA->PIO_CODR = GPIO_USB_PU; - - // Disconnect and reconnect USB controller for 100ms - usb_disable(); - - // Wait for a short while - for (volatile size_t i=0; i<0x100000; i++); - // Reconnect USB reconnect - AT91C_BASE_PIOA->PIO_SODR = GPIO_USB_PU; - AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU; + // Disconnect and reconnect USB controller for 100ms + usb_disable(); + + // Wait for a short while + for (volatile size_t i=0; i<0x100000; i++); + //sleep(1); + + // Reconnect USB reconnect + AT91C_BASE_PIOA->PIO_SODR = GPIO_USB_PU; + AT91C_BASE_PIOA->PIO_OER = GPIO_USB_PU; } //*---------------------------------------------------------------------------- -- 2.39.5