diff --git a/ChangeLog b/ChangeLog index 6be41e2..01d673f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2015-07-15 Niibe Yutaka + * src/flash.c: Detect flash_page_size at runtime. + + * src/main.c: Remove dependency to board.h. + + * src/neug.c: Update from NeuG 1.0.2. + * src/adc_stm32f103.c: Update. + * chopstx: Update to 0.07. * src/sys.c: Update. * src/sys.h: Update. diff --git a/src/adc_stm32f103.c b/src/adc_stm32f103.c index 85d9030..356d96b 100644 --- a/src/adc_stm32f103.c +++ b/src/adc_stm32f103.c @@ -3,7 +3,8 @@ * In this ADC driver, there are NeuG specific parts. * You need to modify to use this as generic ADC driver. * - * Copyright (C) 2011, 2012, 2013 Free Software Initiative of Japan + * Copyright (C) 2011, 2012, 2013, 2015 + * Free Software Initiative of Japan * Author: NIIBE Yutaka * * This file is a part of NeuG, a True Random Number Generator @@ -32,6 +33,8 @@ #include "stm32f103.h" #include "adc.h" +#include "config.h" + #define NEUG_CRC32_COUNTS 4 #define STM32_ADC_ADC1_DMA_PRIORITY 2 @@ -92,15 +95,6 @@ | ADC_SQR3_SQ4_N(ADC_CHANNEL_VREFINT) #define NEUG_ADC_SETTING1_NUM_CHANNELS 4 -#if !defined(NEUG_ADC_SETTING2_SMPR1) -#define NEUG_ADC_SETTING2_SMPR1 0 -#define NEUG_ADC_SETTING2_SMPR2 ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) \ - | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5) -#define NEUG_ADC_SETTING2_SQR3 ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) \ - | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1) -#define NEUG_ADC_SETTING2_NUM_CHANNELS 2 -#endif - /* * Do calibration for both of ADCs. @@ -133,9 +127,67 @@ void adc_init (void) RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN); } +#include "sys.h" +#if defined(HAVE_SYS_H) +# define SYS_BOARD_ID sys_board_id +#else +# include "board.h" +# define SYS_BOARD_ID BOARD_ID +#endif + +static void +get_adc_config (uint32_t config[4]) +{ + config[2] = ADC_SQR1_NUM_CH(2); + switch (SYS_BOARD_ID) + { + case BOARD_ID_FST_01: + config[0] = 0; + config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) + | ADC_SMPR2_SMP_AN9(ADC_SAMPLE_1P5); + config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) + | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9); + break; + + case BOARD_ID_OLIMEX_STM32_H103: + case BOARD_ID_STBEE: + config[0] = ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5) + | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_1P5); + config[1] = 0; + config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) + | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11); + break; + + case BOARD_ID_STBEE_MINI: + config[0] = 0; + config[1] = ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5) + | ADC_SMPR2_SMP_AN2(ADC_SAMPLE_1P5); + config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) + | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN2); + break; + + case BOARD_ID_CQ_STARM: + case BOARD_ID_FST_01_00: + case BOARD_ID_MAPLE_MINI: + case BOARD_ID_STM32_PRIMER2: + case BOARD_ID_STM8S_DISCOVERY: + default: + config[0] = 0; + config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) + | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5); + config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) + | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1); + break; + } +} + void adc_start (void) { + uint32_t config[4]; + + get_adc_config (config); + /* Use DMA channel 1. */ RCC->AHBENR |= RCC_AHBENR_DMA1EN; DMA1_Channel1->CCR = STM32_DMA_CCR_RESET_VALUE; @@ -156,11 +208,11 @@ void adc_start (void) ADC2->CR1 = (ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0 | ADC_CR1_SCAN); ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON; - ADC2->SMPR1 = NEUG_ADC_SETTING2_SMPR1; - ADC2->SMPR2 = NEUG_ADC_SETTING2_SMPR2; - ADC2->SQR1 = ADC_SQR1_NUM_CH(NEUG_ADC_SETTING2_NUM_CHANNELS); + ADC2->SMPR1 = config[0]; + ADC2->SMPR2 = config[1]; + ADC2->SQR1 = config[2]; ADC2->SQR2 = 0; - ADC2->SQR3 = NEUG_ADC_SETTING2_SQR3; + ADC2->SQR3 = config[3]; #ifdef DELIBARATELY_DO_IT_WRONG_START_STOP /* diff --git a/src/flash.c b/src/flash.c index 683f34a..446d436 100644 --- a/src/flash.c +++ b/src/flash.c @@ -1,7 +1,7 @@ /* * flash.c -- Data Objects (DO) and GPG Key handling on Flash ROM * - * Copyright (C) 2010, 2011, 2012, 2013, 2014 + * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 * Free Software Initiative of Japan * Author: NIIBE Yutaka * @@ -35,7 +35,6 @@ #include "config.h" -#include "board.h" #include "sys.h" #include "gnuk.h" @@ -65,7 +64,9 @@ */ #define FLASH_DATA_POOL_HEADER_SIZE 2 -#define FLASH_DATA_POOL_SIZE (FLASH_PAGE_SIZE*2) +#define FLASH_DATA_POOL_SIZE (flash_page_size*2) + +static uint16_t flash_page_size; static const uint8_t *data_pool; extern uint8_t _keystore_pool; @@ -99,22 +100,30 @@ static int key_available_at (const uint8_t *k, int key_size) return 1; } + +#define CHIP_ID_REG ((uint32_t *)0xe0042000) const uint8_t * flash_init (void) { uint16_t gen0, gen1; uint16_t *gen0_p = (uint16_t *)&_data_pool; - uint16_t *gen1_p = (uint16_t *)(&_data_pool + FLASH_PAGE_SIZE); + uint16_t *gen1_p; + + flash_page_size = 1024; + if (((*CHIP_ID_REG) & 0xfff) == 0x0414) + flash_page_size = 2048; + + gen1_p = (uint16_t *)(&_data_pool + flash_page_size); /* Check data pool generation and choose the page */ gen0 = *gen0_p; gen1 = *gen1_p; if (gen0 == 0xffff) - data_pool = &_data_pool + FLASH_PAGE_SIZE; + data_pool = &_data_pool + flash_page_size; else if (gen1 == 0xffff) data_pool = &_data_pool; else if (gen1 > gen0) - data_pool = &_data_pool + FLASH_PAGE_SIZE; + data_pool = &_data_pool + flash_page_size; else data_pool = &_data_pool; @@ -135,7 +144,7 @@ flash_init_keys (void) int key_size = gpg_get_algo_attr_key_size (i, GPG_KEY_STORAGE); kd[i].pubkey = NULL; - for (k = p; k < p + FLASH_PAGE_SIZE; k += key_size) + for (k = p; k < p + flash_page_size; k += key_size) if (key_available_at (k, key_size)) { int prv_len = gpg_get_algo_attr_key_size (i, GPG_KEY_PRIVATE); @@ -144,7 +153,7 @@ flash_init_keys (void) break; } - p += FLASH_PAGE_SIZE; + p += flash_page_size; } } @@ -189,11 +198,11 @@ flash_copying_gc (void) if (data_pool == &_data_pool) { src = &_data_pool; - dst = &_data_pool + FLASH_PAGE_SIZE; + dst = &_data_pool + flash_page_size; } else { - src = &_data_pool + FLASH_PAGE_SIZE; + src = &_data_pool + flash_page_size; dst = &_data_pool; } @@ -208,7 +217,7 @@ flash_copying_gc (void) static int is_data_pool_full (size_t size) { - return last_p + size > data_pool + FLASH_PAGE_SIZE; + return last_p + size > data_pool + flash_page_size; } static uint8_t * @@ -322,7 +331,7 @@ static uint8_t * flash_key_getpage (enum kind_of_key kk) { /* There is a page for each KK. */ - return &_keystore_pool + (FLASH_PAGE_SIZE * kk); + return &_keystore_pool + (flash_page_size * kk); } uint8_t * @@ -333,7 +342,7 @@ flash_key_alloc (enum kind_of_key kk) int key_size = gpg_get_algo_attr_key_size (kk, GPG_KEY_STORAGE); /* Seek free space in the page. */ - for (k = k0; k < k0 + FLASH_PAGE_SIZE; k += key_size) + for (k = k0; k < k0 + flash_page_size; k += key_size) { const uint32_t *p = (const uint32_t *)k; @@ -382,10 +391,10 @@ flash_key_write (uint8_t *key_addr, static int flash_check_all_other_keys_released (const uint8_t *key_addr, int key_size) { - uint32_t start = (uint32_t)key_addr & ~(FLASH_PAGE_SIZE - 1); + uint32_t start = (uint32_t)key_addr & ~(flash_page_size - 1); const uint32_t *p = (const uint32_t *)start; - while (p < (const uint32_t *)(start + FLASH_PAGE_SIZE)) + while (p < (const uint32_t *)(start + flash_page_size)) if (p == (const uint32_t *)key_addr) p += key_size/4; else @@ -411,7 +420,7 @@ void flash_key_release (uint8_t *key_addr, int key_size) { if (flash_check_all_other_keys_released (key_addr, key_size)) - flash_erase_page (((uint32_t)key_addr & ~(FLASH_PAGE_SIZE - 1))); + flash_erase_page (((uint32_t)key_addr & ~(flash_page_size - 1))); else flash_key_fill_zero_as_released (key_addr, key_size); } @@ -619,9 +628,8 @@ flash_erase_binary (uint8_t file_id) if (flash_check_blank (p, FLASH_CH_CERTIFICATE_SIZE) == 0) { flash_erase_page ((uint32_t)p); -#if FLASH_CH_CERTIFICATE_SIZE > FLASH_PAGE_SIZE - flash_erase_page ((uint32_t)p + FLASH_PAGE_SIZE); -#endif + if (FLASH_CH_CERTIFICATE_SIZE > flash_page_size) + flash_erase_page ((uint32_t)p + flash_page_size); } return 0; diff --git a/src/main.c b/src/main.c index 46b6548..93ee88d 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,6 @@ #include #include "config.h" -#include "board.h" #include "sys.h" #include "adc.h" @@ -426,15 +425,20 @@ main (int argc, char *argv[]) #ifdef DFU_SUPPORT #define FLASH_SYS_START_ADDR 0x08000000 #define FLASH_SYS_END_ADDR (0x08000000+0x1000) +#define CHIP_ID_REG ((uint32_t *)0xE0042000) { extern uint8_t _sys; uint32_t addr; handler *new_vector = (handler *)FLASH_SYS_START_ADDR; void (*func) (void (*)(void)) = (void (*)(void (*)(void)))new_vector[9]; + uint32_t flash_page_size = 1024; /* 1KiB default */ + + if ((*CHIP_ID_ADDR)&0x07 == 0x04) /* High dencity device. */ + flash_page_size = 2048; /* It's 2KiB. */ /* Kill DFU */ for (addr = FLASH_SYS_START_ADDR; addr < FLASH_SYS_END_ADDR; - addr += FLASH_PAGE_SIZE) + addr += flash_page_size) flash_erase_page (addr); /* copy system service routines */ diff --git a/src/neug.c b/src/neug.c index 4ecee99..9dde205 100644 --- a/src/neug.c +++ b/src/neug.c @@ -215,7 +215,7 @@ static int ep_process (int mode) CRC->DR = adc_buf[i*4 + 1]; CRC->DR = adc_buf[i*4 + 2]; CRC->DR = adc_buf[i*4 + 3]; - v = CRC->DR & 0xff; + v = CRC->DR & 0xff; /* First byte of CRC->DR is used here. */ noise_source_continuous_test (v); sha256_ctx_data.wbuf[i] = v; ep_init (NEUG_MODE_CONDITIONED); /* The rest three-byte of @@ -280,8 +280,6 @@ uint16_t neug_rc_max; uint16_t neug_p64_max; uint16_t neug_p4k_max; -#include "board.h" - static void noise_source_cnt_max_reset (void) { neug_err_cnt = neug_err_cnt_rc = neug_err_cnt_p64 = neug_err_cnt_p4k = 0; diff --git a/src/neug.h b/src/neug.h index 04a223b..f84f0cb 100644 --- a/src/neug.h +++ b/src/neug.h @@ -3,9 +3,9 @@ #define NEUG_PRE_LOOP 32 -#define NEUG_MODE_CONDITIONED 0 -#define NEUG_MODE_RAW 1 -#define NEUG_MODE_RAW_DATA 2 +#define NEUG_MODE_CONDITIONED 0 /* Conditioned data. */ +#define NEUG_MODE_RAW 1 /* CRC-32 filtered sample data. */ +#define NEUG_MODE_RAW_DATA 2 /* Sample data directly. */ extern uint8_t neug_mode; extern uint16_t neug_err_cnt;