 8e143fc962
			
		
	
	8e143fc962
	
	
	
		
			
			This adds source files that allow to run TinyUSB stack on DA1469x-dk-pro board. Source files .c .S and .ld are taken from Apache Mynewt repository. Those files were stripped to allow starting board without Mynewt os.
		
			
				
	
	
		
			178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Licensed to the Apache Software Foundation (ASF) under one
 | |
|  * or more contributor license agreements.  See the NOTICE file
 | |
|  * distributed with this work for additional information
 | |
|  * regarding copyright ownership.  The ASF licenses this file
 | |
|  * to you under the Apache License, Version 2.0 (the
 | |
|  * "License"); you may not use this file except in compliance
 | |
|  * with the License.  You may obtain a copy of the License at
 | |
|  *
 | |
|  *  http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing,
 | |
|  * software distributed under the License is distributed on an
 | |
|  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | |
|  * KIND, either express or implied.  See the License for the
 | |
|  * specific language governing permissions and limitations
 | |
|  * under the License.
 | |
|  */
 | |
| 
 | |
| #include <assert.h>
 | |
| #include <stdint.h>
 | |
| #include "mcu/mcu.h"
 | |
| #include "mcu/da1469x_hal.h"
 | |
| #include <flash_map/flash_map.h>
 | |
| #include <mcu/da1469x_clock.h>
 | |
| #if MCUBOOT_MYNEWT
 | |
| #include "bootutil/bootutil.h"
 | |
| #include "bootutil/image.h"
 | |
| #include "bootutil/bootutil_log.h"
 | |
| #include "mcu/da1469x_dma.h"
 | |
| #include "mcu/da1469x_otp.h"
 | |
| #endif
 | |
| 
 | |
| #if MYNEWT_VAL(BOOT_CUSTOM_START) && MCUBOOT_MYNEWT
 | |
| sec_text_ram_core
 | |
| #endif
 | |
| void __attribute__((naked))
 | |
| hal_system_start(void *img_start)
 | |
| {
 | |
|     uint32_t img_data_addr;
 | |
|     uint32_t *img_data;
 | |
| 
 | |
|     img_data_addr = MCU_MEM_QSPIF_M_START_ADDRESS + (uint32_t)img_start;
 | |
| 
 | |
|     assert(img_data_addr < MCU_MEM_QSPIF_M_END_ADDRESS);
 | |
| 
 | |
|     img_data = (uint32_t *)img_data_addr;
 | |
| 
 | |
|     asm volatile (".syntax unified        \n"
 | |
|                   /* 1st word is stack pointer */
 | |
|                   "    msr  msp, %0       \n"
 | |
|                   /* 2nd word is a reset handler (image entry) */
 | |
|                   "    bx   %1            \n"
 | |
|                   : /* no output */
 | |
|                   : "r" (img_data[0]), "r" (img_data[1]));
 | |
| }
 | |
| 
 | |
| void
 | |
| hal_system_restart(void *img_start)
 | |
| {
 | |
|     uint32_t primask __attribute__((unused));
 | |
|     int i;
 | |
| 
 | |
|     /*
 | |
|      * Disable interrupts, and leave them disabled.
 | |
|      * They get re-enabled when system starts coming back again.
 | |
|      */
 | |
|     __HAL_DISABLE_INTERRUPTS(primask);
 | |
| 
 | |
|     for (i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++) {
 | |
|         NVIC->ICER[i] = 0xffffffff;
 | |
|     }
 | |
| 
 | |
|     hal_system_start(img_start);
 | |
| }
 | |
| 
 | |
| #if MYNEWT_VAL(BOOT_CUSTOM_START) && MCUBOOT_MYNEWT
 | |
| #define IMAGE_TLV_AES_NONCE   0x50
 | |
| #define IMAGE_TLV_SECRET_ID   0x60
 | |
| 
 | |
| sec_text_ram_core void
 | |
| boot_custom_start(uintptr_t flash_base, struct boot_rsp *rsp)
 | |
| {
 | |
|     int rc;
 | |
|     struct image_tlv_iter it;
 | |
|     const struct flash_area *fap;
 | |
|     uint32_t off;
 | |
|     uint16_t len;
 | |
|     uint16_t type;
 | |
|     uint8_t buf[8];
 | |
|     uint8_t key;
 | |
|     uint32_t nonce[2];
 | |
|     bool has_aes_nonce;
 | |
|     bool has_secret_id;
 | |
|     DMA_Type *dma_regs = DMA;
 | |
|     uint32_t  jump_offset = rsp->br_image_off + rsp->br_hdr->ih_hdr_size;
 | |
| 
 | |
|     BOOT_LOG_INF("Custom initialization");
 | |
| 
 | |
|     /* skip to booting if we are running nonsecure mode */
 | |
|     if (!(CRG_TOP->SECURE_BOOT_REG & 0x1)) {
 | |
|         hal_system_start((void *)(flash_base + jump_offset));
 | |
|     }
 | |
| 
 | |
|     rc = flash_area_open(flash_area_id_from_image_slot(0), &fap);
 | |
|     assert(rc == 0);
 | |
| 
 | |
|     rc = bootutil_tlv_iter_begin(&it, rsp->br_hdr, fap, IMAGE_TLV_ANY, true);
 | |
|     assert(rc == 0);
 | |
| 
 | |
|     has_aes_nonce = has_secret_id = false;
 | |
|     while (true) {
 | |
|         rc = bootutil_tlv_iter_next(&it, &off, &len, &type);
 | |
|         assert(rc >= 0);
 | |
| 
 | |
|         if (rc > 0) {
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         if (type == IMAGE_TLV_AES_NONCE) {
 | |
|             assert(len == 8);
 | |
| 
 | |
|             rc = flash_area_read(fap, off, buf, len);
 | |
|             assert(rc == 0);
 | |
| 
 | |
|             nonce[0] = __builtin_bswap32(*(uint32_t *)buf);
 | |
|             nonce[1] = __builtin_bswap32(*(uint32_t *)(buf + 4));
 | |
|             has_aes_nonce = true;
 | |
|         } else if (type == IMAGE_TLV_SECRET_ID) {
 | |
|             assert(len == 4);
 | |
| 
 | |
|             rc = flash_area_read(fap, off, buf, len);
 | |
|             assert(rc == 0);
 | |
| 
 | |
|             key = buf[0];
 | |
|             has_secret_id = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     assert(has_aes_nonce && has_secret_id && key <= 7);
 | |
| 
 | |
|     /* enable OTP clock and set in read mode */
 | |
|     da1469x_clock_amba_enable(CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk);
 | |
|     da1469x_otp_set_mode(OTPC_MODE_READ);
 | |
| 
 | |
|     /* disable decrypt on the fly and program start and end addresses */
 | |
|     QSPIC->QSPIC_CTR_CTRL_REG = 0;
 | |
|     QSPIC->QSPIC_CTR_SADDR_REG = jump_offset;
 | |
|     QSPIC->QSPIC_CTR_EADDR_REG = QSPIC->QSPIC_CTR_SADDR_REG +
 | |
|                                  rsp->br_hdr->ih_img_size - 1;
 | |
| 
 | |
|     /* securely DMA hardware key from secret storage to QSPI decrypt engine */
 | |
|     dma_regs->DMA_REQ_MUX_REG |= 0xf000;
 | |
|     dma_regs->DMA7_LEN_REG = 8;
 | |
|     dma_regs->DMA7_A_START_REG = MCU_OTPM_BASE + OTP_SEGMENT_QSPI_FW_KEYS +
 | |
|                                  (32 * key);
 | |
|     dma_regs->DMA7_B_START_REG = (uint32_t)&QSPIC->QSPIC_CTR_KEY_0_3_REG;
 | |
|     dma_regs->DMA7_CTRL_REG = DMA_DMA7_CTRL_REG_AINC_Msk |
 | |
|                               DMA_DMA7_CTRL_REG_BINC_Msk |
 | |
|                               (MCU_DMA_BUS_WIDTH_4B << DMA_DMA7_CTRL_REG_BW_Pos) |
 | |
|                               DMA_DMA7_CTRL_REG_DMA_ON_Msk;
 | |
|     while (dma_regs->DMA7_IDX_REG != 8);
 | |
| 
 | |
|     /* program NONCE */
 | |
|     QSPIC->QSPIC_CTR_NONCE_0_3_REG = nonce[0];
 | |
|     QSPIC->QSPIC_CTR_NONCE_4_7_REG = nonce[1];
 | |
| 
 | |
|     /* turn back on decrypt on the fly */
 | |
|     QSPIC->QSPIC_CTR_CTRL_REG = 1;
 | |
| 
 | |
|     /* set OTP to standby and turn off clock */
 | |
|     da1469x_otp_set_mode(OTPC_MODE_STBY);
 | |
|     da1469x_clock_amba_disable(CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk);
 | |
| 
 | |
|     hal_system_start((void *)(flash_base + jump_offset));
 | |
| }
 | |
| #endif
 |