From 84740f3d6a435b72ff21db02dd6477ff5a25fa2a Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Thu, 9 May 2019 16:01:07 -0400 Subject: [PATCH] changes to make firmware interop on all hw models --- fido2/device.h | 5 ++--- targets/stm32l432/src/ams.c | 9 ++++++++- targets/stm32l432/src/ams.h | 2 +- targets/stm32l432/src/app.h | 2 +- targets/stm32l432/src/device.c | 13 +++++++++---- targets/stm32l432/src/init.c | 6 +++--- targets/stm32l432/src/nfc.c | 10 ++++++---- targets/stm32l432/src/nfc.h | 6 +++++- targets/stm32l432/src/sense.c | 4 +++- 9 files changed, 38 insertions(+), 19 deletions(-) diff --git a/fido2/device.h b/fido2/device.h index 5d9950e..46a8e20 100644 --- a/fido2/device.h +++ b/fido2/device.h @@ -99,9 +99,8 @@ typedef enum { // 2: fastest clock rate. Generally for USB interface. void device_set_clock_rate(DEVICE_CLOCK_RATE param); -// Returns 1 if operating in NFC mode. -// 0 otherwise. -bool device_is_nfc(); +// Returns NFC_IS_NA (0), NFC_IS_ACTIVE (1), or NFC_IS_AVAILABLE (2) +int device_is_nfc(); void device_init_button(); diff --git a/targets/stm32l432/src/ams.c b/targets/stm32l432/src/ams.c index 335758f..9212d53 100644 --- a/targets/stm32l432/src/ams.c +++ b/targets/stm32l432/src/ams.c @@ -270,7 +270,7 @@ void ams_print_int1(uint8_t int0) #endif } -void ams_init() +int ams_init() { LL_GPIO_SetPinMode(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN,LL_GPIO_MODE_OUTPUT); LL_GPIO_SetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN); @@ -283,6 +283,13 @@ void ams_init() // delay(10); SELECT(); delay(1); + + uint8_t productType = ams_read_reg(AMS_REG_PRODUCT_TYPE); + if (productType == 0x14) + { + return 1; + } + return 0; } void ams_configure() diff --git a/targets/stm32l432/src/ams.h b/targets/stm32l432/src/ams.h index ef701bf..8828eaa 100644 --- a/targets/stm32l432/src/ams.h +++ b/targets/stm32l432/src/ams.h @@ -39,7 +39,7 @@ typedef union #define SELECT() LL_GPIO_ResetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN) #define UNSELECT() LL_GPIO_SetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN) -void ams_init(); +int ams_init(); void ams_configure(); void ams_read_buffer(uint8_t * data, int len); diff --git a/targets/stm32l432/src/app.h b/targets/stm32l432/src/app.h index bb24de3..3bcfac2 100644 --- a/targets/stm32l432/src/app.h +++ b/targets/stm32l432/src/app.h @@ -72,6 +72,6 @@ void hw_init(int lf); #define SOLO_AMS_IRQ_PIN LL_GPIO_PIN_15 #define SKIP_BUTTON_CHECK_WITH_DELAY 0 -#define SKIP_BUTTON_CHECK_FAST 1 +#define SKIP_BUTTON_CHECK_FAST 0 #endif diff --git a/targets/stm32l432/src/device.c b/targets/stm32l432/src/device.c index 1f387dd..f498122 100644 --- a/targets/stm32l432/src/device.c +++ b/targets/stm32l432/src/device.c @@ -41,7 +41,7 @@ uint32_t __90_ms = 0; uint32_t __device_status = 0; uint32_t __last_update = 0; extern PCD_HandleTypeDef hpcd; -static bool haveNFC = 0; +static int _NFC_status = 0; static bool isLowFreq = 0; // #define IS_BUTTON_PRESSED() (0 == (LL_GPIO_ReadInputPort(SOLO_BUTTON_PORT) & SOLO_BUTTON_PIN)) @@ -138,7 +138,12 @@ void device_init(int argc, char *argv[]) hw_init(LOW_FREQUENCY); - if (haveNFC) + if (! tsc_sensor_exists()) + { + _NFC_status = nfc_init(); + } + + if (_NFC_status == NFC_IS_ACTIVE) { printf1(TAG_NFC, "Have NFC\r\n"); isLowFreq = 1; @@ -165,9 +170,9 @@ void device_init(int argc, char *argv[]) } -bool device_is_nfc() +int device_is_nfc() { - return haveNFC; + return _NFC_status; } void wait_for_usb_tether() diff --git a/targets/stm32l432/src/init.c b/targets/stm32l432/src/init.c index 38f8e4d..e7fa953 100644 --- a/targets/stm32l432/src/init.c +++ b/targets/stm32l432/src/init.c @@ -31,6 +31,7 @@ #include "usbd_cdc_if.h" #include "device.h" #include "init.h" +#include "sense.h" #include APP_CONFIG // KHz @@ -94,8 +95,6 @@ void hw_init(int lowfreq) SystemClock_Config(); } - - if (!lowfreq) { init_pwm(); @@ -108,7 +107,8 @@ void hw_init(int lowfreq) #endif init_rng(); - //init_spi(); + + init_spi(); } diff --git a/targets/stm32l432/src/nfc.c b/targets/stm32l432/src/nfc.c index 5b72940..f412187 100644 --- a/targets/stm32l432/src/nfc.c +++ b/targets/stm32l432/src/nfc.c @@ -55,11 +55,12 @@ void nfc_state_init() NFC_STATE.block_num = 1; } -bool nfc_init() +int nfc_init() { uint32_t t1; + int init; nfc_state_init(); - ams_init(); + init = ams_init(); // Detect if we are powered by NFC field by listening for a message for // first 10 ms. @@ -67,13 +68,14 @@ bool nfc_init() while ((millis() - t1) < 10) { if (nfc_loop() > 0) - return 1; + return NFC_IS_ACTIVE; } // Under USB power. Configure AMS chip. ams_configure(); - return 0; + return NFC_IS_AVAILABLE; + return NFC_IS_NA; } void process_int0(uint8_t int0) diff --git a/targets/stm32l432/src/nfc.h b/targets/stm32l432/src/nfc.h index a8627a2..86f64d2 100644 --- a/targets/stm32l432/src/nfc.h +++ b/targets/stm32l432/src/nfc.h @@ -8,7 +8,11 @@ // Return number of bytes read if any. int nfc_loop(); -bool nfc_init(); +int nfc_init(); + +#define NFC_IS_NA 0 +#define NFC_IS_ACTIVE 1 +#define NFC_IS_AVAILABLE 2 typedef struct { diff --git a/targets/stm32l432/src/sense.c b/targets/stm32l432/src/sense.c index de56e0c..84ac625 100644 --- a/targets/stm32l432/src/sense.c +++ b/targets/stm32l432/src/sense.c @@ -119,7 +119,9 @@ uint32_t tsc_read_button(uint32_t index) int tsc_sensor_exists() { - int does; + static uint8_t does = 0; + if (does) return 1; + LL_GPIO_SetPinMode(GPIOB, (1 << 1), LL_GPIO_MODE_INPUT); LL_GPIO_SetPinPull(GPIOB, (1 << 1), LL_GPIO_PULL_UP);