[Cryptech-Commits] [sw/stm32] 02/02: Add code to access the keystore memory (SPI flash).

git at cryptech.is git at cryptech.is
Sat May 21 11:17:32 UTC 2016


This is an automated email from the git hooks/post-receive script.

fredrik at thulin.net pushed a commit to branch master
in repository sw/stm32.

commit 3d16ad028d69acc581095430d20463ed66f65779
Author: Fredrik Thulin <fredrik at thulin.net>
AuthorDate: Sat May 21 13:16:58 2016 +0200

    Add code to access the keystore memory (SPI flash).
---
 Makefile                                           |  1 +
 .../TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c      | 33 ++++++++--
 projects/cli-test/cli-test.c                       | 11 ++++
 stm-fpgacfg.h                                      |  3 +-
 stm-init.c                                         | 30 ++++++++--
 stm-keystore.c                                     | 70 ++++++++++++++++++++++
 stm-keystore.h                                     | 57 ++++++++++++++++++
 7 files changed, 191 insertions(+), 14 deletions(-)

diff --git a/Makefile b/Makefile
index 2409723..9c0661b 100644
--- a/Makefile
+++ b/Makefile
@@ -56,6 +56,7 @@ export BOARD_OBJS = \
 	$(TOPLEVEL)/stm-rtc.o \
 	$(TOPLEVEL)/spiflash_n25q128.o \
 	$(TOPLEVEL)/stm-fpgacfg.o \
+	$(TOPLEVEL)/stm-keystore.o \
 	$(TOPLEVEL)/syscalls.o \
 	$(BOARD_DIR)/TOOLCHAIN_GCC_ARM/startup_stm32f429xx.o \
 	$(BOARD_DIR)/system_stm32f4xx.o \
diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c
index d0f814e..6d1d029 100644
--- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c
+++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c
@@ -200,7 +200,6 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
 	/* Peripheral clock enable */
 	__I2C2_CLK_ENABLE();
     }
-
 }
 
 void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
@@ -214,10 +213,25 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
 void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
 {
     GPIO_InitTypeDef GPIO_InitStruct;
-    if (hspi->Instance == SPI2) {
-	/* Peripheral clock enable */
-	__SPI2_CLK_ENABLE();
+    if (hspi->Instance == SPI1) {
+	/* SPI1 is the keystore memory.
+	 *
+	 * SPI1 GPIO Configuration
+	 * PA5     ------> SPI2_SCK
+	 * PA6     ------> SPI2_MISO
+	 * PA7     ------> SPI2_MOSI
+	*/
+	__GPIOA_CLK_ENABLE();
+	GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
+	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+	GPIO_InitStruct.Pull = GPIO_NOPULL;
+	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+	GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
+	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
+	/* Peripheral clock enable */
+	__SPI1_CLK_ENABLE();
+    } else if (hspi->Instance == SPI2) {
 	/* SPI2 is the FPGA config memory.
 	 *
 	 * SPI2 GPIO Configuration
@@ -225,19 +239,26 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
 	 * PB14     ------> SPI2_MISO
 	 * PB15     ------> SPI2_MOSI
 	*/
+	__GPIOB_CLK_ENABLE();
 	GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
 	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 	GPIO_InitStruct.Pull = GPIO_NOPULL;
 	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 	GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+	/* Peripheral clock enable */
+	__SPI2_CLK_ENABLE();
     }
 }
 
 void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
 {
-
-    if (hspi->Instance == SPI2) {
+    if (hspi->Instance == SPI1) {
+	/* Peripheral clock disable */
+	__HAL_RCC_SPI1_CLK_DISABLE();
+	HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
+    } else if (hspi->Instance == SPI2) {
 	/* Peripheral clock disable */
 	__HAL_RCC_SPI2_CLK_DISABLE();
 	HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
diff --git a/projects/cli-test/cli-test.c b/projects/cli-test/cli-test.c
index b8d5388..6bc70dd 100644
--- a/projects/cli-test/cli-test.c
+++ b/projects/cli-test/cli-test.c
@@ -36,6 +36,7 @@
 #include "stm-led.h"
 #include "stm-uart.h"
 #include "stm-fpgacfg.h"
+#include "stm-keystore.h"
 #include "mgmt-cli.h"
 
 #include <string.h>
@@ -126,6 +127,12 @@ int cmd_show_fpga_status(struct cli_def *cli, const char *command, char *argv[],
     return CLI_OK;
 }
 
+int cmd_show_keystore_status(struct cli_def *cli, const char *command, char *argv[], int argc)
+{
+    cli_print(cli, "Keystore memory is %sonline", (keystore_check_id() != 1) ? "NOT ":"");
+    return CLI_OK;
+}
+
 /* The chunk size have to be a multiple of the SPI flash page size (256 bytes),
    and it has to match the chunk size in the program sending the bitstream over the UART.
 */
@@ -271,6 +278,10 @@ void configure_cli_show(struct cli_def *cli)
     cli_command_branch(show, fpga);
     /* show fpga status*/
     cli_command_node(show_fpga, status, "Show status about the FPGA");
+
+    cli_command_branch(show, keystore);
+    /* show keystore status*/
+    cli_command_node(show_keystore, status, "Show status of the keystore memory");
 }
 
 void configure_cli_fpga(struct cli_def *cli)
diff --git a/stm-fpgacfg.h b/stm-fpgacfg.h
index 367aa3d..0d5eeb9 100644
--- a/stm-fpgacfg.h
+++ b/stm-fpgacfg.h
@@ -69,8 +69,7 @@
     gpio_output(FPGA_INIT_Port, FPGA_INIT_Pin, GPIO_PIN_RESET);			   \
     gpio_output(FPGA_PROGRAM_Port, FPGA_PROGRAM_Pin, GPIO_PIN_SET);		   \
     /* Configure FPGA_DONE input pin */   					   \
-    //gpio_input(FPGA_DONE_Port, FPGA_DONE_Pin, GPIO_PULLUP) \
-    1
+    gpio_input(FPGA_DONE_Port, FPGA_DONE_Pin, GPIO_PULLUP)
 
 
 enum fpgacfg_access_ctrl {
diff --git a/stm-init.c b/stm-init.c
index 8711cc1..7ded2a6 100644
--- a/stm-init.c
+++ b/stm-init.c
@@ -49,6 +49,7 @@
 #endif
 #ifdef HAL_SPI_MODULE_ENABLED
 #include "stm-fpgacfg.h"
+#include "stm-keystore.h"
 #endif
 
 /* Private variables ---------------------------------------------------------*/
@@ -65,6 +66,7 @@ static void MX_USART2_UART_Init(void);
 static void MX_I2C2_Init(void);
 #endif
 #ifdef HAL_SPI_MODULE_ENABLED
+static void MX_SPI1_Init(void);
 static void MX_SPI2_Init(void);
 #endif
 
@@ -96,6 +98,7 @@ void stm_init(void)
   MX_I2C2_Init();
 #endif
 #ifdef HAL_SPI_MODULE_ENABLED
+  MX_SPI1_Init();
   MX_SPI2_Init();
 #endif
 }
@@ -173,13 +176,11 @@ static void MX_GPIO_Init(void)
   /* Set up GPIOs to manage access to the FPGA config memory.
    * FPGACFG_GPIO_INIT is defined in stm-fpgacfg.h.
    */
-  /* GPIO Ports Clock Enable */
   FPGACFG_GPIO_INIT();
-  /*
-  __GPIOJ_CLK_ENABLE();
-  gpio_output(FPGA_INIT_Port, FPGA_INIT_Pin, GPIO_PIN_RESET);
-  gpio_output(FPGA_PROGRAM_Port, FPGA_PROGRAM_Pin, GPIO_PIN_SET);
-  */
+  /* Set up GPIOs for the keystore memory.
+   * KEYSTORE_GPIO_INIT is defined in stm-keystore.h.
+   */
+  KEYSTORE_GPIO_INIT();
 #endif /* HAL_SPI_MODULE_ENABLED */
 }
 #undef gpio_output
@@ -206,6 +207,23 @@ void MX_I2C2_Init(void)
 #endif
 
 #ifdef HAL_SPI_MODULE_ENABLED
+/* SPI1 (keystore memory) init function */
+void MX_SPI1_Init(void)
+{
+    hspi_keystore.Instance = SPI1;
+    hspi_keystore.Init.Mode = SPI_MODE_MASTER;
+    hspi_keystore.Init.Direction = SPI_DIRECTION_2LINES;
+    hspi_keystore.Init.DataSize = SPI_DATASIZE_8BIT;
+    hspi_keystore.Init.CLKPolarity = SPI_POLARITY_LOW;
+    hspi_keystore.Init.CLKPhase = SPI_PHASE_1EDGE;
+    hspi_keystore.Init.NSS = SPI_NSS_SOFT;
+    hspi_keystore.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
+    hspi_keystore.Init.FirstBit = SPI_FIRSTBIT_MSB;
+    hspi_keystore.Init.TIMode = SPI_TIMODE_DISABLE;
+    hspi_keystore.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
+    hspi_keystore.Init.CRCPolynomial = 10;
+    HAL_SPI_Init(&hspi_keystore);
+}
 /* SPI2 (FPGA config memory) init function */
 void MX_SPI2_Init(void)
 {
diff --git a/stm-keystore.c b/stm-keystore.c
new file mode 100644
index 0000000..19c5ccc
--- /dev/null
+++ b/stm-keystore.c
@@ -0,0 +1,70 @@
+/*
+ * stm-keystore.c
+ * ----------
+ * Functions for accessing the keystore memory.
+ *
+ * Copyright (c) 2016, NORDUnet A/S All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the NORDUnet nor the names of its contributors may
+ *   be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "stm32f4xx_hal.h"
+#include "stm-keystore.h"
+#include "stm-init.h"
+
+SPI_HandleTypeDef hspi_keystore;
+
+struct spiflash_ctx keystore_ctx = {&hspi_keystore, KSM_PROM_CS_N_GPIO_Port, KSM_PROM_CS_N_Pin};
+
+int keystore_check_id()
+{
+    return n25q128_check_id(&keystore_ctx);
+}
+
+int keystore_write_data(uint32_t offset, const uint8_t *buf, const uint32_t len)
+{
+    return n25q128_write_data(&keystore_ctx, offset, buf, len);
+}
+
+int keystore_erase_sectors(int num)
+{
+    if (num > N25Q128_NUM_SECTORS - 1 || num < 0) num = N25Q128_NUM_SECTORS - 1;
+    while (num) {
+	int timeout = 1000;
+	while (timeout--) {
+	    int i = n25q128_get_wip_flag(&keystore_ctx);
+	    if (i < 0) return 0;
+	    if (! i) break;
+	    HAL_Delay(10);
+	}
+
+	if (! n25q128_erase_sector(&keystore_ctx, num--)) {
+            return 0;
+        }
+    }
+    return 1;
+}
diff --git a/stm-keystore.h b/stm-keystore.h
new file mode 100644
index 0000000..9120340
--- /dev/null
+++ b/stm-keystore.h
@@ -0,0 +1,57 @@
+/*
+ * stm-keystore.h
+ * ---------
+ * Functions and defines for accessing the keystore memory.
+ *
+ * Copyright (c) 2016, NORDUnet A/S All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the NORDUnet nor the names of its contributors may
+ *   be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __STM32_KEYSTORE_H
+#define __STM32_KEYSTORE_H
+
+#include "stm32f4xx_hal.h"
+#include "spiflash_n25q128.h"
+
+/* Pins connected to the FPGA config memory (SPI flash) */
+#define KSM_PROM_CS_N_Pin                  GPIO_PIN_0
+#define KSM_PROM_CS_N_GPIO_Port            GPIOB
+
+#define KEYSTORE_GPIO_INIT()		\
+    __GPIOB_CLK_ENABLE();		\
+    /* Configure GPIO pin for FPGA config memory chip select : KSM_PROM_CS_N */        \
+    gpio_output(KSM_PROM_CS_N_GPIO_Port, KSM_PROM_CS_N_Pin, GPIO_PIN_SET)
+
+
+extern SPI_HandleTypeDef hspi_keystore;
+
+extern int keystore_check_id(void);
+extern int keystore_write_data(uint32_t offset, const uint8_t *buf, const uint32_t len);
+extern int keystore_erase_sectors(int num);
+
+#endif /* __STM32_KEYSTORE_H */



More information about the Commits mailing list