From b723126deb588650155475048ab6e4faf276a718 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 3 May 2019 09:04:28 +0200 Subject: [PATCH] Make smartcard support detection dynamic --- armsrc/appmain.c | 16 +++++++++------- client/cmdparser.c | 18 +++++++++--------- common/i2c.c | 20 ++++++++++++++++---- common/i2c.h | 1 + 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 65233d718..b7693a96c 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -441,15 +441,20 @@ void SendCapabilities(void) { #ifdef WITH_FLASH capabilities.compiled_with_flash = true; + // TODO + capabilities.hw_available_flash = true; #else capabilities.compiled_with_flash = false; + capabilities.hw_available_flash = false; #endif #ifdef WITH_SMARTCARD capabilities.compiled_with_smartcard = true; + uint8_t maj, min; + capabilities.hw_available_smartcard = I2C_get_version(&maj, &min) == PM3_SUCCESS; #else capabilities.compiled_with_smartcard = false; + capabilities.hw_available_smartcard = false; #endif - #ifdef WITH_FPC capabilities.compiled_with_fpc = true; #else @@ -457,8 +462,11 @@ void SendCapabilities(void) { #endif #ifdef WITH_FPC_HOST capabilities.compiled_with_fpc_host = true; + // TODO + capabilities.hw_available_fpc_host = true; #else capabilities.compiled_with_fpc_host = false; + capabilities.hw_available_fpc_host = false; #endif #ifdef WITH_LF capabilities.compiled_with_lf = true; @@ -510,12 +518,6 @@ void SendCapabilities(void) { #else capabilities.compiled_with_lcd = false; #endif - -// TODO -// capabilities.hw_available_flash -// capabilities.hw_available_smartcard -// capabilities.hw_available_fpc_host - reply_ng(CMD_CAPABILITIES, PM3_SUCCESS, (uint8_t *)&capabilities, sizeof(capabilities)); } diff --git a/client/cmdparser.c b/client/cmdparser.c index c7bd7a01e..8d942c168 100644 --- a/client/cmdparser.c +++ b/client/cmdparser.c @@ -30,17 +30,17 @@ bool IfPm3Present(void) { bool IfPm3Flash(void) { if (!IfPm3Present()) return false; -// TODO -// capabilities.hw_available_flash - return pm3_capabilities.compiled_with_flash; + if (!pm3_capabilities.compiled_with_flash) + return false; + return pm3_capabilities.hw_available_flash; } bool IfPm3Smartcard(void) { if (!IfPm3Present()) return false; -// TODO -// capabilities.hw_available_smartcard - return pm3_capabilities.compiled_with_smartcard; + if (!pm3_capabilities.compiled_with_smartcard) + return false; + return pm3_capabilities.hw_available_smartcard; } bool IfPm3Fpc(void) { @@ -52,9 +52,9 @@ bool IfPm3Fpc(void) { bool IfPm3FpcHost(void) { if (!IfPm3Present()) return false; -// TODO -// capabilities.hw_available_fpc_host - return pm3_capabilities.compiled_with_fpc_host; + if (!pm3_capabilities.compiled_with_fpc_host) + return false; + return pm3_capabilities.hw_available_fpc_host; } bool IfPm3Lf(void) { diff --git a/common/i2c.c b/common/i2c.c index 0b26bb0dc..ceb548948 100644 --- a/common/i2c.c +++ b/common/i2c.c @@ -594,13 +594,25 @@ bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t d void I2C_print_status(void) { DbpString(_BLUE_("Smart card module (ISO 7816)")); + uint8_t maj, min; + if (I2C_get_version(&maj, &min) == PM3_SUCCESS) + Dbprintf(" version.................v%x.%02d", maj, min); + else + DbpString(" version................." _RED_("FAILED")); +} + +int I2C_get_version(uint8_t *maj, uint8_t *min) { uint8_t resp[] = {0, 0, 0, 0}; I2C_Reset_EnterMainProgram(); uint8_t len = I2C_BufferRead(resp, sizeof(resp), I2C_DEVICE_CMD_GETVERSION, I2C_DEVICE_ADDRESS_MAIN); - if (len > 0) - Dbprintf(" version.................v%x.%02d", resp[0], resp[1]); - else - DbpString(" version................." _RED_("FAILED")); + if (len > 0) { + Dbprintf(" version.................v%x.%02d", maj, min); + *maj = resp[0]; + *min = resp[1]; + return PM3_SUCCESS; + } else { + return PM3_EDEVNOTSUPP; + } } // Will read response from smart card module, retries 3 times to get the data. diff --git a/common/i2c.h b/common/i2c.h index 648d0d8d9..52be70ef0 100644 --- a/common/i2c.h +++ b/common/i2c.h @@ -47,4 +47,5 @@ void SmartCardUpgrade(uint64_t arg0); void SmartCardSetBaud(uint64_t arg0); void SmartCardSetClock(uint64_t arg0); void I2C_print_status(void); +int I2C_get_version(uint8_t *maj, uint8_t *min); #endif