refactor clock rates, fix warnings
This commit is contained in:
parent
57930aaa13
commit
ff0d42c8d5
@ -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
|
||||||
|
@ -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;
|
||||||
@ -293,7 +292,7 @@ static int16_t u2f_register(struct u2f_register_request * req, bool fromNFC)
|
|||||||
return U2F_SW_CONDITIONS_NOT_SATISFIED;
|
return U2F_SW_CONDITIONS_NOT_SATISFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( u2f_new_keypair(&key_handle, req->app, pubkey) == -1)
|
if ( u2f_new_keypair(&key_handle, req->app, pubkey) == -1)
|
||||||
{
|
{
|
||||||
return U2F_SW_INSUFFICIENT_MEMORY;
|
return U2F_SW_INSUFFICIENT_MEMORY;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user