From bfb01844fb0ce48e960374c3bc6ecf208b6c6bb0 Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Wed, 29 Jul 2015 18:52:43 +0200 Subject: [PATCH] add: USB Speed Test to hw status fix: choose Real Time Clock divider based on actual slow clock frequency --- armsrc/appmain.c | 34 ++++++++++++++++++++++++++++++++-- armsrc/util.c | 11 ++++++----- client/cmdhw.c | 12 +++++++++++- client/cmdmain.c | 21 ++++++++++----------- 4 files changed, 59 insertions(+), 19 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b5e7d7ea..99776a98 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -298,18 +298,48 @@ 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 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); + + cmd_send(CMD_ACK,1,0,0,0,0); } #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF) @@ -1212,7 +1242,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); 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 23b6ce21..44f878af 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 */ @@ -428,11 +429,20 @@ 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 (1000*USB_CMD_DATA_SIZE) + + clearCommandBuffer(); + UsbCommand c = {CMD_STATUS, {USB_SPEED_TEST_SIZE}}; SendCommand(&c); + if (!WaitForResponseTimeout(CMD_ACK,&c,1500)) { + 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 512aa13c..9298360d 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -131,24 +131,23 @@ 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; - } - } + 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"); + PrintAndLog("Waiting for a response from the proxmark..."); + PrintAndLog("Don't forget to cancel its operation first by pressing on the button"); } } return false; -- 2.39.2