/* * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause *//* ... */#ifndef_BOOT_PICOBIN_H#define_BOOT_PICOBIN_H#ifndefNO_PICO_PLATFORM#include"pico/platform.h"#else#ifndef_u#define_u(x)x##u#endif/* ... */#endif/** \file picobin.h* \defgroup boot_picobin_headers boot_picobin_headers** \brief Constants for PICOBIN format*//* ... */// these are designed to not look like (likely) 16/32-bit ARM or RISC-V instructions or look like valid pointers#definePICOBIN_BLOCK_MARKER_START_u(0xffffded3)#definePICOBIN_BLOCK_MARKER_END_u(0xab123579)#definePICOBIN_MAX_BLOCK_SIZE_u(0x280)#definePICOBIN_MAX_IMAGE_DEF_BLOCK_SIZE_u(0x180)#definePICOBIN_MAX_PARTITION_TABLE_BLOCK_SIZE_u(0x280)// note bit 6 is used to make parity even#definePICOBIN_BLOCK_ITEM_1BS_NEXT_BLOCK_OFFSET_u(0x41)#definePICOBIN_BLOCK_ITEM_1BS_IMAGE_TYPE_u(0x42)#definePICOBIN_BLOCK_ITEM_1BS_VECTOR_TABLE_u(0x03)#definePICOBIN_BLOCK_ITEM_1BS_ENTRY_POINT_u(0x44)#definePICOBIN_BLOCK_ITEM_1BS_ROLLING_WINDOW_DELTA_u(0x05)#definePICOBIN_BLOCK_ITEM_LOAD_MAP_u(0x06)#definePICOBIN_BLOCK_ITEM_1BS_HASH_DEF_u(0x47)#definePICOBIN_BLOCK_ITEM_1BS_VERSION_u(0x48)#definePICOBIN_BLOCK_ITEM_SIGNATURE_u(0x09)#definePICOBIN_BLOCK_ITEM_PARTITION_TABLE_u(0x0a)#definePICOBIN_BLOCK_ITEM_HASH_VALUE_u(0x4b)#definePICOBIN_BLOCK_ITEM_SALT_u(0x0c)#definePICOBIN_BLOCK_ITEM_2BS_IGNORED(_u(0x80)|_u(0x7e))#definePICOBIN_BLOCK_ITEM_2BS_LAST(_u(0x80)|_u(0x7f))// ----#definePICOBIN_INDEX_TO_BITS(y,x)(y##_##x<<y##_LSB)#definePICOBIN_IMAGE_TYPE_IMAGE_TYPE_LSB_u(0)#definePICOBIN_IMAGE_TYPE_IMAGE_TYPE_BITS_u(0x000f)#definePICOBIN_IMAGE_TYPE_IMAGE_TYPE_INVALID_u(0x0)#definePICOBIN_IMAGE_TYPE_IMAGE_TYPE_EXE_u(0x1)#definePICOBIN_IMAGE_TYPE_IMAGE_TYPE_DATA_u(0x2)#definePICOBIN_IMAGE_TYPE_IMAGE_TYPE_AS_BITS(x)PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_IMAGE_TYPE,x)#definePICOBIN_IMAGE_TYPE_EXE_SECURITY_LSB_u(4)#definePICOBIN_IMAGE_TYPE_EXE_SECURITY_BITS_u(0x0030)#definePICOBIN_IMAGE_TYPE_EXE_SECURITY_UNSPECIFIED_u(0x0)#definePICOBIN_IMAGE_TYPE_EXE_SECURITY_NS_u(0x1)#definePICOBIN_IMAGE_TYPE_EXE_SECURITY_S_u(0x2)#definePICOBIN_IMAGE_TYPE_EXE_SECURITY_AS_BITS(x)PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_EXE_SECURITY,x)#definePICOBIN_IMAGE_TYPE_EXE_CPU_LSB_u(8)#definePICOBIN_IMAGE_TYPE_EXE_CPU_BITS_u(0x0700)#definePICOBIN_IMAGE_TYPE_EXE_CPU_ARM_u(0)#definePICOBIN_IMAGE_TYPE_EXE_CPU_RISCV_u(1)#definePICOBIN_IMAGE_TYPE_EXE_CPU_VARMULET_u(2)#definePICOBIN_IMAGE_TYPE_EXE_CPU_AS_BITS(x)PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_EXE_CPU,x)#definePICOBIN_IMAGE_TYPE_EXE_CHIP_LSB_u(12)#definePICOBIN_IMAGE_TYPE_EXE_CHIP_BITS_u(0x7000)#definePICOBIN_IMAGE_TYPE_EXE_CHIP_RP2040_u(0)#definePICOBIN_IMAGE_TYPE_EXE_CHIP_RP2350_u(1)#definePICOBIN_IMAGE_TYPE_EXE_CHIP_AS_BITS(x)PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_EXE_CHIP,x)#definePICOBIN_IMAGE_TYPE_EXE_TBYB_BITS_u(0x8000)// todo assert no overlap ^#definePICOBIN_PARTITION_PERMISSIONS_LSB_u(26)#definePICOBIN_PARTITION_PERMISSIONS_BITS_u(0xfc000000)#definePICOBIN_PARTITION_PERMISSION_S_R_BITS_u(0x04000000)#definePICOBIN_PARTITION_PERMISSION_S_W_BITS_u(0x08000000)#definePICOBIN_PARTITION_PERMISSION_NS_R_BITS_u(0x10000000)#definePICOBIN_PARTITION_PERMISSION_NS_W_BITS_u(0x20000000)#definePICOBIN_PARTITION_PERMISSION_NSBOOT_R_BITS_u(0x40000000)#definePICOBIN_PARTITION_PERMISSION_NSBOOT_W_BITS_u(0x80000000)#definePICOBIN_PARTITION_LOCATION_FIRST_SECTOR_LSB_u(0)#definePICOBIN_PARTITION_LOCATION_FIRST_SECTOR_BITS_u(0x00001fff)#definePICOBIN_PARTITION_LOCATION_LAST_SECTOR_LSB_u(13)#definePICOBIN_PARTITION_LOCATION_LAST_SECTOR_BITS_u(0x03ffe000)#definePICOBIN_PARTITION_FLAGS_HAS_ID_BITS_u(0x00000001)#definePICOBIN_PARTITION_FLAGS_LINK_TYPE_LSB_u(1)#definePICOBIN_PARTITION_FLAGS_LINK_TYPE_BITS_u(0x00000006)#definePICOBIN_PARTITION_FLAGS_LINK_VALUE_LSB_u(3)#definePICOBIN_PARTITION_FLAGS_LINK_VALUE_BITS_u(0x00000078)#definePICOBIN_PARTITION_MAX_EXTRA_FAMILIES_u(3)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_NUM_EXTRA_FAMILIES_LSB_u(7)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_NUM_EXTRA_FAMILIES_BITS_u(0x00000180)// these are an optimization when booting in either ARM or RISC-V, to avoid looking at partitions// which are known not to contain the right sort of binary, OR as a way to prevent// auto-architecture-switch. NOTE: the first partition that can be booted, will be,// so if you have a RISC-V binary in the first partition, and auto-arhcitecture-switch enabled, then// even if booting under ARM, with an ARM binary in a later partition, the RISC-V binary// will be booted by default; setting PICOBIN_PARTITION_FLAGS_IGNORED_DURING_ARM_BOOT_BITS// on the partition, will have the RISC-V binary containing partition ignored under ARM// boot#definePICOBIN_PARTITION_FLAGS_IGNORED_DURING_ARM_BOOT_BITS_u(0x00000200)#definePICOBIN_PARTITION_FLAGS_IGNORED_DURING_RISCV_BOOT_BITS_u(0x00000400)#definePICOBIN_PARTITION_FLAGS_UF2_DOWNLOAD_AB_NON_BOOTABLE_OWNER_AFFINITY_u(0x00000800)#definePICOBIN_PARTITION_FLAGS_HAS_NAME_BITS_u(0x00001000)#definePICOBIN_PARTITION_FLAGS_UF2_DOWNLOAD_NO_REBOOT_BITS_u(0x00002000)// we have a bit for each well known family-id .. note we expect there to be more in the future with new chips,// but we have plenty of space for now.#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILIES_LSB_u(14)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2040_BITS_u(0x00004000)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_ABSOLUTE_BITS_u(0x00008000)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_DATA_BITS_u(0x00010000)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2350_ARM_S_BITS_u(0x00020000)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2350_RISCV_BITS_u(0x00040000)#definePICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2350_ARM_NS_BITS_u(0x00080000)#definePICOBIN_PARTITION_FLAGS_LINK_TYPE_NONE_u(0)#definePICOBIN_PARTITION_FLAGS_LINK_TYPE_A_PARTITION_u(1)#definePICOBIN_PARTITION_FLAGS_LINK_TYPE_OWNER_PARTITION_u(2)#definePICOBIN_PARTITION_FLAGS_LINK_TYPE_AS_BITS(x)PICOBIN_INDEX_TO_BITS(PICOBIN_PARTITION_FLAGS_LINK_TYPE,x)#definePICOBIN_HASH_SHA256_u(0x01)#definePICOBIN_SIGNATURE_SECP256K1_u(0x01)82 defines#ifndef__ASSEMBLER__#include<stdbool.h>typedefstruct{// these must all be word aligneduint32_tstorage_address_rel;uint32_truntime_address;uint32_tsize;...}picobin_load_map_entry;typedefstruct{uint32_theader;picobin_load_map_entryentries[];...}picobin_load_map;staticinlineunsignedintpicobin_load_map_entry_count(constpicobin_load_map*lm){return(lm->header<<1)>>25;}{ ... }staticinlineboolpicobin_load_map_is_relative(constpicobin_load_map*lm){return(int32_t)lm->header>=0;}{ ... }/* ... */#endif/* ... */#endif
Details
Show: from
Types: Columns:
All items filtered out
All items filtered out
This file uses the notable symbols shown below. Click anywhere in the file to view more details.