refactor clock rates, fix warnings

This commit is contained in:
Conor Patrick 2019-02-26 13:56:06 -05:00
parent 57930aaa13
commit ff0d42c8d5
6 changed files with 75 additions and 46 deletions

View File

@ -86,5 +86,17 @@ void boot_st_bootloader();
// HID wink command // HID wink command
void device_wink(); void device_wink();
typedef enum {
DEVICE_LOW_POWER_IDLE = 0,
DEVICE_LOW_POWER_FAST = 1,
DEVICE_FAST = 2,
} DEVICE_CLOCK_RATE;
// Set the clock rate for the device.
// Three modes are targetted for Solo.
// 0: Lowest clock rate for NFC.
// 1: fastest clock rate supported at a low power setting for NFC FIDO.
// 2: fastest clock rate. Generally for USB interface.
void device_set_clock_rate(DEVICE_CLOCK_RATE param);
#endif #endif

View File

@ -278,7 +278,6 @@ static int16_t u2f_register(struct u2f_register_request * req, bool fromNFC)
uint8_t i[] = {0x0,U2F_EC_FMT_UNCOMPRESSED}; uint8_t i[] = {0x0,U2F_EC_FMT_UNCOMPRESSED};
struct u2f_key_handle key_handle; struct u2f_key_handle key_handle;
static uint32_t count = 0;
uint8_t pubkey[64]; uint8_t pubkey[64];
uint8_t hash[32]; uint8_t hash[32];
uint8_t * sig = (uint8_t*)req; uint8_t * sig = (uint8_t*)req;

View File

@ -34,7 +34,31 @@
#include APP_CONFIG #include APP_CONFIG
// KHz // KHz
#define CLOCK_RATE 16000 #define MAX_CLOCK_RATE 24000
#define SET_CLOCK_RATE2() SystemClock_Config()
#if MAX_CLOCK_RATE == 48000
#define SET_CLOCK_RATE0() SystemClock_Config_LF32()
#define SET_CLOCK_RATE1() SystemClock_Config_LF48()
#elif MAX_CLOCK_RATE == 32000
#define SET_CLOCK_RATE0() SystemClock_Config_LF24()
#define SET_CLOCK_RATE1() SystemClock_Config_LF32()
#elif MAX_CLOCK_RATE == 28000
#define SET_CLOCK_RATE0() SystemClock_Config_LF24()
#define SET_CLOCK_RATE1() SystemClock_Config_LF28()
#elif MAX_CLOCK_RATE == 24000
#define SET_CLOCK_RATE0() SystemClock_Config_LF16()
#define SET_CLOCK_RATE1() SystemClock_Config_LF24()
#elif MAX_CLOCK_RATE == 20000
#define SET_CLOCK_RATE0() SystemClock_Config_LF16()
#define SET_CLOCK_RATE1() SystemClock_Config_LF20()
#elif MAX_CLOCK_RATE == 16000
#define SET_CLOCK_RATE0() SystemClock_Config_LF8()
#define SET_CLOCK_RATE1() SystemClock_Config_LF16()
#else
#error "Invalid clock rate selected"
#endif
USBD_HandleTypeDef Solo_USBD_Device; USBD_HandleTypeDef Solo_USBD_Device;
@ -42,6 +66,11 @@ static void LL_Init(void);
#define Error_Handler() _Error_Handler(__FILE__,__LINE__) #define Error_Handler() _Error_Handler(__FILE__,__LINE__)
void _Error_Handler(char *file, int line); void _Error_Handler(char *file, int line);
void SystemClock_Config(void);
void SystemClock_Config_LF16(void);
void SystemClock_Config_LF20(void);
void SystemClock_Config_LF24(void);
void SystemClock_Config_LF28(void); void SystemClock_Config_LF28(void);
void SystemClock_Config_LF48(void); void SystemClock_Config_LF48(void);
@ -56,23 +85,8 @@ void hw_init(int lowfreq)
if (lowfreq) if (lowfreq)
{ {
// Under voltage LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE2); // Under voltage
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE2); device_set_clock_rate(DEVICE_LOW_POWER_IDLE);
#if CLOCK_RATE == 48000
SystemClock_Config_LF48();
#elif CLOCK_RATE == 32000
SystemClock_Config_LF32();
#elif CLOCK_RATE == 28000
SystemClock_Config_LF28();
#elif CLOCK_RATE == 24000
SystemClock_Config_LF24();
#elif CLOCK_RATE == 20000
SystemClock_Config_LF20();
#elif CLOCK_RATE == 16000
SystemClock_Config_LF16();
#else
#error "Invalid clock rate selected"
#endif
LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE2); LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE2);
} }
else else
@ -123,6 +137,22 @@ static void LL_Init(void)
} }
void device_set_clock_rate(DEVICE_CLOCK_RATE param)
{
switch(param)
{
case DEVICE_LOW_POWER_IDLE:
SET_CLOCK_RATE0();
break;
case DEVICE_LOW_POWER_FAST:
SET_CLOCK_RATE1();
break;
case DEVICE_FAST:
SET_CLOCK_RATE2();
break;
}
}
/** /**
* @brief System Clock Configuration * @brief System Clock Configuration
* @retval None * @retval None
@ -847,7 +877,7 @@ void init_millisecond_timer(int lf)
if (!lf) if (!lf)
TIM_InitStruct.Prescaler = 48000; TIM_InitStruct.Prescaler = 48000;
else else
TIM_InitStruct.Prescaler = CLOCK_RATE; TIM_InitStruct.Prescaler = MAX_CLOCK_RATE;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP; TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 90; TIM_InitStruct.Autoreload = 90;

View File

@ -22,10 +22,6 @@
#ifndef _INIT_H_ #ifndef _INIT_H_
#define _INIT_H_ #define _INIT_H_
void SystemClock_Config(void);
void SystemClock_Config_LF(void);
void SystemClock_Config_LF16(void);
void init_usb(); void init_usb();
void init_gpio(void); void init_gpio(void);
void init_debug_uart(void); void init_debug_uart(void);

View File

@ -396,12 +396,8 @@ void nfc_process_iblock(uint8_t * buf, int len)
uint8_t * payload = buf + 1 + 5; uint8_t * payload = buf + 1 + 5;
uint8_t plen = apdu->lc; uint8_t plen = apdu->lc;
int selected; int selected;
uint8_t res[32];
uint32_t t1;
int l1;
CTAP_RESPONSE ctap_resp; CTAP_RESPONSE ctap_resp;
int status; int status;
struct u2f_register_request * u2freq = (struct u2f_register_request *)payload;
printf1(TAG_NFC,"Iblock: "); printf1(TAG_NFC,"Iblock: ");
dump_hex1(TAG_NFC, buf, len); dump_hex1(TAG_NFC, buf, len);
@ -479,19 +475,19 @@ void nfc_process_iblock(uint8_t * buf, int len)
return; return;
} }
t1 = millis(); timestamp();
// WTX_on(WTX_TIME_DEFAULT); // WTX_on(WTX_TIME_DEFAULT);
// SystemClock_Config_LF32(); // SystemClock_Config_LF32();
// delay(300); // delay(300);
SystemClock_Config_LF24(); device_set_clock_rate(DEVICE_LOW_POWER_FAST);;
u2f_request_nfc(&buf[1], len, &ctap_resp); u2f_request_nfc(&buf[1], len, &ctap_resp);
SystemClock_Config_LF16(); device_set_clock_rate(DEVICE_LOW_POWER_IDLE);;
// if (!WTX_off()) // if (!WTX_off())
// return; // return;
printf1(TAG_NFC,"U2F Register P2 took %d\r\n", millis() - t1); printf1(TAG_NFC,"U2F Register P2 took %d\r\n", timestamp());
nfc_write_response_chaining(buf[0], ctap_resp.data, ctap_resp.length, 0 ); nfc_write_response_chaining(buf[0], ctap_resp.data, ctap_resp.length, 0 );
// printf1(TAG_NFC, "U2F resp len: %d\r\n", ctap_resp.length); // printf1(TAG_NFC, "U2F resp len: %d\r\n", ctap_resp.length);
@ -518,16 +514,16 @@ void nfc_process_iblock(uint8_t * buf, int len)
return; return;
} }
t1 = millis(); timestamp();
// WTX_on(WTX_TIME_DEFAULT); // WTX_on(WTX_TIME_DEFAULT);
u2f_request_nfc(&buf[1], len, &ctap_resp); u2f_request_nfc(&buf[1], len, &ctap_resp);
// if (!WTX_off()) // if (!WTX_off())
// return; // return;
printf1(TAG_NFC, "U2F resp len: %d\r\n", ctap_resp.length); printf1(TAG_NFC, "U2F resp len: %d\r\n", ctap_resp.length);
printf1(TAG_NFC,"U2F Authenticate processing %d (took %d)\r\n", millis(), millis() - t1); printf1(TAG_NFC,"U2F Authenticate processing %d (took %d)\r\n", millis(), timestamp());
nfc_write_response_chaining(buf[0], ctap_resp.data, ctap_resp.length, 0); nfc_write_response_chaining(buf[0], ctap_resp.data, ctap_resp.length, 0);
printf1(TAG_NFC,"U2F Authenticate answered %d (took %d)\r\n", millis(), millis() - t1); printf1(TAG_NFC,"U2F Authenticate answered %d (took %d)\r\n", millis(), timestamp);
break; break;
case APDU_FIDO_NFCCTAP_MSG: case APDU_FIDO_NFCCTAP_MSG:
@ -536,7 +532,7 @@ void nfc_process_iblock(uint8_t * buf, int len)
break; break;
} }
t1 = millis(); timestamp();
printf1(TAG_NFC, "FIDO2 CTAP message. %d\r\n", t1); printf1(TAG_NFC, "FIDO2 CTAP message. %d\r\n", t1);
WTX_on(WTX_TIME_DEFAULT); WTX_on(WTX_TIME_DEFAULT);
@ -558,9 +554,9 @@ void nfc_process_iblock(uint8_t * buf, int len)
ctap_resp.data[ctap_resp.length - 2] = SW_SUCCESS >> 8; ctap_resp.data[ctap_resp.length - 2] = SW_SUCCESS >> 8;
ctap_resp.data[ctap_resp.length - 1] = SW_SUCCESS & 0xff; ctap_resp.data[ctap_resp.length - 1] = SW_SUCCESS & 0xff;
printf1(TAG_NFC,"CTAP processing %d (took %d)\r\n", millis(), millis() - t1); printf1(TAG_NFC,"CTAP processing %d (took %d)\r\n", millis(), timestamp());
nfc_write_response_chaining(buf[0], ctap_resp.data, ctap_resp.length, 0); nfc_write_response_chaining(buf[0], ctap_resp.data, ctap_resp.length, 0);
printf1(TAG_NFC,"CTAP answered %d (took %d)\r\n", millis(), millis() - t1); printf1(TAG_NFC,"CTAP answered %d (took %d)\r\n", millis(), timestamp());
break; break;
case APDU_INS_READ_BINARY: case APDU_INS_READ_BINARY:
@ -613,7 +609,7 @@ void clear_ibuf()
memset(ibuf, 0, sizeof(ibuf)); memset(ibuf, 0, sizeof(ibuf));
} }
void nfc_process_block(uint8_t * buf, int len) void nfc_process_block(uint8_t * buf, unsigned int len)
{ {
if (!len) if (!len)
@ -706,8 +702,6 @@ void nfc_process_block(uint8_t * buf, int len)
void nfc_loop() void nfc_loop()
{ {
static uint32_t t1 = 0;
static uint32_t t2 = 0;
uint8_t buf[32]; uint8_t buf[32];
AMS_DEVICE ams; AMS_DEVICE ams;
int len = 0; int len = 0;
@ -732,7 +726,6 @@ void nfc_loop()
if (ams.regs.int0 & AMS_INT_INIT) if (ams.regs.int0 & AMS_INT_INIT)
{ {
nfc_state_init(); nfc_state_init();
t1 = millis();
} }
if (ams.regs.int1) if (ams.regs.int1)
{ {
@ -771,14 +764,12 @@ void nfc_loop()
printf1(TAG_NFC, "HLTA/Halt\r\n"); printf1(TAG_NFC, "HLTA/Halt\r\n");
break; break;
case NFC_CMD_RATS: case NFC_CMD_RATS:
t2 = millis();
answer_rats(buf[1]); answer_rats(buf[1]);
NFC_STATE.block_num = 1; NFC_STATE.block_num = 1;
clear_ibuf(); clear_ibuf();
WTX_clear(); WTX_clear();
printf1(TAG_NFC,"RATS answered %d (took %d)\r\n",millis(), millis() - t1);
break; break;
default: default:

View File

@ -106,6 +106,7 @@
*/ */
#include "stm32l4xx.h" #include "stm32l4xx.h"
#include "device.h"
#include "init.h" #include "init.h"
#if !defined (HSE_VALUE) #if !defined (HSE_VALUE)
@ -220,7 +221,7 @@ void SystemInit(void)
/* Disable all interrupts */ /* Disable all interrupts */
RCC->CIER = 0x00000000U; RCC->CIER = 0x00000000U;
SystemClock_Config_LF16(); device_set_clock_rate(DEVICE_LOW_POWER_IDLE);
} }