139 lines
3.8 KiB
C
139 lines
3.8 KiB
C
/*
|
|
* Copyright (C) 2018 SoloKeys, Inc. <https://solokeys.com/>
|
|
*
|
|
* This file is part of Solo.
|
|
*
|
|
* Solo is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Solo is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Solo. If not, see <https://www.gnu.org/licenses/>
|
|
*
|
|
* This code is available under licenses for commercial use.
|
|
* Please contact SoloKeys for more information.
|
|
*/
|
|
#include "em_device.h"
|
|
#include "em_chip.h"
|
|
#include "em_timer.h"
|
|
|
|
#include "device.h"
|
|
#include "app.h"
|
|
#include "u2f.h"
|
|
#include "log.h"
|
|
#include "InitDevice.h"
|
|
|
|
void bootloader_init(void);
|
|
uint8_t REBOOT_FLAG;
|
|
|
|
int main(void)
|
|
{
|
|
int count = 0;
|
|
uint32_t t1 = 0;
|
|
uint32_t t2 = 0;
|
|
uint32_t accum = 0;
|
|
uint32_t dt = 0;
|
|
uint8_t hidmsg[64];
|
|
/* Chip errata */
|
|
CHIP_Init();
|
|
|
|
EMU_enter_DefaultMode_from_RESET();
|
|
CMU_enter_DefaultMode_from_RESET();
|
|
// ADC0_enter_DefaultMode_from_RESET();
|
|
USART0_enter_DefaultMode_from_RESET();
|
|
USART1_enter_DefaultMode_from_RESET();
|
|
// LDMA_enter_DefaultMode_from_RESET();
|
|
CRYOTIMER_enter_DefaultMode_from_RESET();
|
|
PORTIO_enter_DefaultMode_from_RESET();
|
|
|
|
bootloader_init();
|
|
|
|
set_logging_mask(
|
|
/*0*/
|
|
TAG_GEN|
|
|
/*TAG_MC |*/
|
|
/*TAG_GA |*/
|
|
/*TAG_WALLET |*/
|
|
TAG_STOR |
|
|
/*TAG_CP |*/
|
|
// TAG_CTAP|
|
|
/*TAG_HID|*/
|
|
/*TAG_U2F|*/
|
|
/*TAG_PARSE |*/
|
|
// TAG_TIME|
|
|
/*TAG_DUMP|*/
|
|
/*TAG_GREEN|*/
|
|
/*TAG_RED|*/
|
|
TAG_ERR
|
|
);
|
|
|
|
printf1(TAG_GEN,"Bootloader init\r\n");
|
|
|
|
if (GPIO_PinInGet(PUSH_BUTTON) == 0)
|
|
{
|
|
t1 = millis();
|
|
while(GPIO_PinInGet(PUSH_BUTTON) == 0 && (millis() - t1) < 2000)
|
|
;
|
|
if (GPIO_PinInGet(PUSH_BUTTON) == 0) {
|
|
bootmode:
|
|
printf1(TAG_GEN,"Reflash condition detected\n");
|
|
ctaphid_init();
|
|
reset_efm8();
|
|
TIMER0_enter_DefaultMode_from_RESET();
|
|
TIMER_TopSet(TIMER0, 255);
|
|
|
|
RGB(LED_INIT_VALUE);
|
|
|
|
/* Infinite loop */
|
|
int count = 0;
|
|
while (1) {
|
|
if (millis() - t1 > 10)
|
|
{
|
|
/*printf("heartbeat %ld\n", beat++);*/
|
|
heartbeat();
|
|
t1 = millis();
|
|
}
|
|
|
|
if (usbhid_recv(hidmsg) > 0)
|
|
{
|
|
/*printf("%d>> ",count++); dump_hex1(TAG_DUMP, hidmsg,sizeof(hidmsg));*/
|
|
// t2 = millis();
|
|
ctaphid_handle_packet(hidmsg);
|
|
// accum += millis() - t2;
|
|
// printf("accum: %d\n", (uint32_t)accum);
|
|
// printf("dt: %d\n", t2 - dt);
|
|
// dt = t2;
|
|
// memset(hidmsg, 0, sizeof(hidmsg));
|
|
}
|
|
else
|
|
{
|
|
/*main_loop_delay();*/
|
|
}
|
|
ctaphid_check_timeouts();
|
|
|
|
if (REBOOT_FLAG) break;
|
|
}
|
|
|
|
// delay(100);
|
|
|
|
}
|
|
}
|
|
|
|
printf1(TAG_GEN,"Normal boot\n");
|
|
|
|
if (is_authorized_to_boot() )
|
|
{
|
|
BOOT_boot();
|
|
} else {
|
|
printf1(TAG_GEN,"Warning: not authorized to boot\n");
|
|
goto bootmode;
|
|
}
|
|
|
|
}
|