Skip to content

Commit 8b9cbf8

Browse files
committed
Merge remote-tracking branch 'https/master'
2 parents fdc7b83 + fef9ab8 commit 8b9cbf8

File tree

6 files changed

+115
-41
lines changed

6 files changed

+115
-41
lines changed

Src/admin_vendor.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,36 @@ int admin_vendor_version(const CAPDU *capdu, RAPDU *rapdu) {
5656
return 0;
5757
}
5858

59+
int admin_vendor_nfc_enable(const CAPDU *capdu, RAPDU *rapdu) {
60+
if (P1 != 0x00 && P1 != 0x01) EXCEPT(SW_WRONG_P1P2);
61+
if (P2 != 0x00) EXCEPT(SW_WRONG_P1P2);
62+
if (LC != 0x00) EXCEPT(SW_WRONG_LENGTH);
63+
64+
uint32_t magic = P1 * 0x50 + 0x100;
65+
FLASH_OBProgramInitTypeDef cfg = {
66+
.OptionType = OPTIONBYTE_PCROP,
67+
.PCROPConfig = FLASH_BANK_1,
68+
.PCROPStartAddr = FLASH_BASE + magic, // Reuse this option word as NFC switch
69+
.PCROPEndAddr = FLASH_BASE + 0xF, // Fixed value
70+
};
71+
DBG_MSG("Unlock OB\n");
72+
HAL_FLASH_Unlock();
73+
HAL_FLASH_OB_Unlock();
74+
int ret = HAL_FLASHEx_OBProgram(&cfg);
75+
HAL_FLASH_OB_Lock();
76+
HAL_FLASH_Lock();
77+
HAL_FLASHEx_OBGetConfig(&cfg);
78+
uint32_t *flash_loc = (uint32_t*) 0x1FFF7808U;
79+
DBG_MSG("HAL_FLASHEx_OBGetConfig: %d %x %x %x\n",
80+
ret, cfg.PCROPStartAddr, cfg.PCROPEndAddr, *flash_loc);
81+
// DBG_MSG("value= %x %x\n", *(uint32_t*)FLASH_BASE, *(uint32_t*)cfg.PCROPStartAddr);
82+
83+
if (ret != HAL_OK) return -1;
84+
85+
return 0;
86+
}
87+
88+
5989
extern uint32_t _stack_boundary;
6090

6191
static int stack_test(const CAPDU *capdu, RAPDU *rapdu) {

Src/device.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
const uint32_t UNTOUCHED_MAX_VAL = 40; /* Suitable for 56K pull-down resistor */
1616
const uint32_t CALI_TIMES = 4;
17-
const uint32_t TOUCH_GAP_TIME = 1500; /* Gap period (in ms) between two consecutive touch events */
17+
const uint32_t TOUCH_GAP_TIME = 800; /* Gap period (in ms) between two consecutive touch events */
18+
const uint32_t MIN_LONG_TOUCH_TIME = 500;
19+
const uint32_t MIN_TOUCH_TIME = 20;
1820

1921
extern TIM_HandleTypeDef htim6;
2022
extern SPI_HandleTypeDef FM_SPI;
@@ -127,25 +129,27 @@ void device_periodic_task(void) {
127129
if (LL_USART_IsActiveFlag_RXNE(DBG_UART.Instance)) {
128130
int data = LL_USART_ReceiveData8(DBG_UART.Instance);
129131
DBG_MSG("UART: %x\n", data);
130-
if ('T' == data) {
131-
set_touch_result(TOUCH_SHORT);
132+
if ('T' == data || 'L' == data) {
133+
set_touch_result('T' == data ? TOUCH_SHORT : TOUCH_LONG);
132134
fsm = TOUCH_STATE_ASSERT;
133135
event_tick = tick;
134136
}
135137
}
136138
#endif
137139
if(GPIO_Touched()) {
140+
measure_touch = 0;
138141
fsm = TOUCH_STATE_DOWN;
139142
event_tick = tick;
140143
}
141144
break;
142145
case TOUCH_STATE_DOWN:
143-
if(!GPIO_Touched()) {
144-
fsm = TOUCH_STATE_IDLE;
145-
} else if (tick - event_tick > 50) {
146-
set_touch_result(TOUCH_SHORT);
147-
fsm = TOUCH_STATE_ASSERT;
148-
event_tick = tick;
146+
if(!GPIO_Touched() || tick - event_tick > MIN_LONG_TOUCH_TIME) {
147+
if (tick - event_tick > MIN_TOUCH_TIME) {
148+
set_touch_result(tick - event_tick > MIN_LONG_TOUCH_TIME ? TOUCH_LONG : TOUCH_SHORT);
149+
fsm = TOUCH_STATE_ASSERT;
150+
event_tick = tick;
151+
} else
152+
fsm = TOUCH_STATE_IDLE;
149153
}
150154
break;
151155
case TOUCH_STATE_ASSERT:
@@ -232,12 +236,9 @@ void usb_resources_alloc(void) {
232236
IFACE_TABLE.ccid = iface++;
233237
EP_SIZE_TABLE.ccid = 64;
234238

235-
if (cfg_is_kbd_interface_enable() && ep <= EP_ADDR_MSK) {
236-
DBG_MSG("Keyboard interface enabled, Iface %u\n", iface);
237-
EP_TABLE.kbd_hid = ep;
238-
IFACE_TABLE.kbd_hid = iface;
239-
EP_SIZE_TABLE.kbd_hid = 8;
240-
}
239+
EP_TABLE.kbd_hid = ep;
240+
IFACE_TABLE.kbd_hid = iface;
241+
EP_SIZE_TABLE.kbd_hid = 8;
241242
}
242243

243244
int device_atomic_compare_and_swap(volatile uint32_t *var, uint32_t expect, uint32_t update) {

Src/lfs_init.c

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
#define CHIP_FLASH_SIZE 0x40000
99
#define LOOKAHEAD_SIZE 16
10-
#define CACHE_SIZE 128
1110
#define WRITE_SIZE 8
1211
#define READ_SIZE 1
1312
#define FS_BASE (&_lfs_begin)
@@ -16,8 +15,9 @@
1615
#define FLASH_ADDR2BLOCK(a) (((a) & ~0x8000000u) / FLASH_PAGE_SIZE)
1716

1817
static struct lfs_config config;
19-
static uint8_t read_buffer[CACHE_SIZE];
20-
static uint8_t prog_buffer[CACHE_SIZE];
18+
static uint8_t read_buffer[LFS_CACHE_SIZE];
19+
static alignas(4) uint8_t prog_buffer[LFS_CACHE_SIZE];
20+
// uint8_t file_buffer[LFS_LFS_CACHE_SIZE];
2121
static alignas(4) uint8_t lookahead_buffer[LOOKAHEAD_SIZE];
2222
extern uint8_t _lfs_begin;
2323

@@ -30,13 +30,29 @@ int block_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, voi
3030

3131
static int program_space(uint32_t paddr, const void *buffer, lfs_size_t size) {
3232
int ret = 0;
33-
for (lfs_size_t i = 0; i < size; i += WRITE_SIZE) {
34-
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, paddr + i, *(const uint64_t *)((uintptr_t)buffer + i)) !=
33+
uint32_t typ;
34+
for (lfs_size_t i = 0; size;) {
35+
// DBG_MSG("%d\n", i);
36+
// if (size >= 512) {
37+
// typ = FLASH_TYPEPROGRAM_FAST;
38+
// } else if (size >= 256) {
39+
// typ = FLASH_TYPEPROGRAM_FAST_AND_LAST;
40+
// } else {
41+
typ = FLASH_TYPEPROGRAM_DOUBLEWORD;
42+
// }
43+
if (HAL_FLASH_Program(typ, paddr + i, *(const uint64_t *)((uintptr_t)buffer + i)) !=
3544
HAL_OK) {
36-
ERR_MSG("Flash prog fail @%#lx", paddr + i);
45+
ERR_MSG("Flash prog failed @%#lx\n", paddr + i);
3746
ret = LFS_ERR_CORRUPT;
3847
break;
3948
}
49+
if (typ == FLASH_TYPEPROGRAM_DOUBLEWORD) {
50+
i += 8;
51+
size -= 8;
52+
} else {
53+
i += 256;
54+
size -= 256;
55+
}
4056
}
4157

4258
return ret;
@@ -51,18 +67,24 @@ int block_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, con
5167
int ret;
5268

5369
// DBG_MSG("blk %d @ %p len %u buf %p\r\n", block, (void*)paddr, size, buffer);
54-
70+
// for (size_t i = 0; i < size; i++)
71+
// {
72+
// if(*(uint8_t*)(paddr+i) != 0xFF) {
73+
// DBG_MSG("blank check: %p = %x\n", paddr+i, *(uint8_t*)(paddr+i));
74+
// }
75+
// }
76+
5577
HAL_FLASH_Unlock();
5678
ret = program_space(paddr, buffer, size);
5779
HAL_FLASH_Lock();
5880

5981
// Invalidate cache
60-
__HAL_FLASH_DATA_CACHE_DISABLE();
61-
// __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
62-
__HAL_FLASH_DATA_CACHE_RESET();
63-
// __HAL_FLASH_INSTRUCTION_CACHE_RESET();
64-
// __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
65-
__HAL_FLASH_DATA_CACHE_ENABLE();
82+
// __HAL_FLASH_DATA_CACHE_DISABLE();
83+
// // __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
84+
// __HAL_FLASH_DATA_CACHE_RESET();
85+
// // __HAL_FLASH_INSTRUCTION_CACHE_RESET();
86+
// // __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
87+
// __HAL_FLASH_DATA_CACHE_ENABLE();
6688

6789
// DBG_MSG("verify %d\n", memcmp(buffer, (const void *)FLASH_ADDR(block, off), size));
6890

@@ -78,26 +100,27 @@ int block_erase(const struct lfs_config *c, lfs_block_t block) {
78100
EraseInitStruct.Banks = FS_BANK;
79101
EraseInitStruct.Page = block + FLASH_ADDR2BLOCK((uintptr_t)FS_BASE);
80102
EraseInitStruct.NbPages = 1;
81-
DBG_MSG("block 0x%x\r\n", EraseInitStruct.Page);
103+
// DBG_MSG("block 0x%x\r\n", EraseInitStruct.Page);
82104

83105
HAL_FLASH_Unlock();
84106

85107
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
86108
ret = LFS_ERR_IO;
87-
ERR_MSG("HAL_FLASHEx_Erase %#x failed", (unsigned int)PageError);
109+
ERR_MSG("HAL_FLASHEx_Erase %#x failed\n", (unsigned int)PageError);
88110
goto erase_fail;
89111
}
90112

91113
// Invalidate cache
92-
__HAL_FLASH_DATA_CACHE_DISABLE();
93-
// __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
94-
__HAL_FLASH_DATA_CACHE_RESET();
95-
// __HAL_FLASH_INSTRUCTION_CACHE_RESET();
96-
// __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
97-
__HAL_FLASH_DATA_CACHE_ENABLE();
114+
// __HAL_FLASH_DATA_CACHE_DISABLE();
115+
// // __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
116+
// __HAL_FLASH_DATA_CACHE_RESET();
117+
// // __HAL_FLASH_INSTRUCTION_CACHE_RESET();
118+
// // __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
119+
// __HAL_FLASH_DATA_CACHE_ENABLE();
98120

99121
erase_fail:
100122
HAL_FLASH_Lock();
123+
// DBG_MSG("done\n");
101124

102125
return ret;
103126
}
@@ -121,7 +144,7 @@ void littlefs_init() {
121144
config.block_size = FLASH_PAGE_SIZE;
122145
config.block_count = CHIP_FLASH_SIZE / FLASH_PAGE_SIZE - FLASH_ADDR2BLOCK((uintptr_t)FS_BASE);
123146
config.block_cycles = 100000;
124-
config.cache_size = CACHE_SIZE;
147+
config.cache_size = LFS_CACHE_SIZE;
125148
config.lookahead_size = LOOKAHEAD_SIZE;
126149
config.read_buffer = read_buffer;
127150
config.prog_buffer = prog_buffer;

Src/main.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ UART_HandleTypeDef huart2;
6161

6262
/* USER CODE BEGIN PV */
6363
extern uint32_t _stack_boundary;
64-
uint32_t device_loop_enable;
64+
uint8_t device_loop_enable, usb_init_done;
6565
/* USER CODE END PV */
6666

6767
/* Private function prototypes -----------------------------------------------*/
@@ -274,6 +274,20 @@ static void config_usb_mode(void) {
274274
// enable the device_periodic_task, which controls LED and Touch sensing
275275
device_loop_enable = 1;
276276
}
277+
278+
static int check_is_nfc_en(void) {
279+
uint32_t *flash_loc = (uint32_t*) 0x1FFF7808U;
280+
uint32_t val = *flash_loc; //FLASH->PCROP1SR;
281+
DBG_MSG("%x\n", val);
282+
return val == 0xFFFFFFFFU || // ST production default value
283+
val == 0xFFFF802a; // magic written by admin_vendor_nfc_enable()
284+
}
285+
286+
// Called by core library
287+
void USBD_LL_Init_Done(void)
288+
{
289+
usb_init_done = 1;
290+
}
277291
/* USER CODE END 0 */
278292

279293
/**
@@ -311,7 +325,7 @@ int main(void) {
311325
MX_USART2_UART_Init();
312326
SetupMPU(); // comment out this line during on-chip debugging
313327
/* USER CODE BEGIN 2 */
314-
in_nfc_mode = 1; // boot in NFC mode by default
328+
in_nfc_mode = check_is_nfc_en(); // boot in NFC mode by default
315329
nfc_init();
316330
set_nfc_state(in_nfc_mode);
317331

@@ -322,6 +336,10 @@ int main(void) {
322336
applets_install();
323337
init_apdu_buffer();
324338

339+
if (!in_nfc_mode) {
340+
while (!detect_usb());
341+
config_usb_mode();
342+
}
325343
DBG_MSG("Main Loop\n");
326344
/* USER CODE END 2 */
327345

@@ -343,7 +361,8 @@ int main(void) {
343361
DBG_MSG("Touch calibrating...\n");
344362
GPIO_Touch_Calibrate();
345363
}
346-
device_loop(1);
364+
if (usb_init_done)
365+
device_loop(1);
347366
++i;
348367
}
349368
}

Src/usbd_conf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,7 @@ static void SystemClockConfig_Resume(void)
792792
{
793793
SystemClock_CustomConfig(false, true);
794794
}
795+
795796
/* USER CODE END 5 */
796797

797798
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

canokey-core

0 commit comments

Comments
 (0)