common binary support
authorNIIBE Yutaka <gniibe@fsij.org>
Wed, 15 Jul 2015 05:29:37 +0000 (14:29 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Wed, 15 Jul 2015 05:29:37 +0000 (14:29 +0900)
ChangeLog
src/adc_stm32f103.c
src/flash.c
src/main.c
src/neug.c
src/neug.h

index 6be41e2..01d673f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2015-07-15  Niibe Yutaka  <gniibe@fsij.org>
 
+       * 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.
index 85d9030..356d96b 100644 (file)
@@ -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 <gniibe@fsij.org>
  *
  * 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
                               | 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
   /*
index 683f34a..446d436 100644 (file)
@@ -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 <gniibe@fsij.org>
  *
@@ -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;
index 46b6548..93ee88d 100644 (file)
@@ -28,7 +28,6 @@
 #include <eventflag.h>
 
 #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 */
index 4ecee99..9dde205 100644 (file)
@@ -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;
index 04a223b..f84f0cb 100644 (file)
@@ -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;