diff options
| author | Stijn Kuipers <stijnkuipers@gmail.com> | 2023-06-29 16:26:07 +0200 |
|---|---|---|
| committer | Stijn Kuipers <stijnkuipers@gmail.com> | 2023-06-29 16:26:07 +0200 |
| commit | fb5a321dd7c2848128b04b306f3e1e59c87a3f70 (patch) | |
| tree | a8ef6273f9f331ebb1971a9baf20a8c897955612 /bootloader/Core/Src/uf2.h | |
| parent | bae7568fd4dd0676b370be8548c7ec95d6521ba1 (diff) | |
| download | plinky-fb5a321dd7c2848128b04b306f3e1e59c87a3f70.tar.gz | |
Initial Filedump
Tadaaa!!
Diffstat (limited to 'bootloader/Core/Src/uf2.h')
| -rwxr-xr-x | bootloader/Core/Src/uf2.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/bootloader/Core/Src/uf2.h b/bootloader/Core/Src/uf2.h new file mode 100755 index 0000000..677c01c --- /dev/null +++ b/bootloader/Core/Src/uf2.h @@ -0,0 +1,99 @@ +/* +The MIT License (MIT) + +Copyright (c) 2018 Microsoft Corp. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +#ifndef UF2FORMAT_H +#define UF2FORMAT_H 1 + + +#include <stdint.h> +#include <stdbool.h> + +// All entries are little endian. + +#define UF2_MAGIC_START0 0x0A324655UL // "UF2\n" +#define UF2_MAGIC_START1 0x9E5D5157UL // Randomly selected +#define UF2_MAGIC_END 0x0AB16F30UL // Ditto + +// If set, the block is "comment" and should not be flashed to the device +#define UF2_FLAG_NOFLASH 0x00000001 +#define UF2_FLAG_FAMILYID_PRESENT 0x00002000 + +#define UF2_IS_MY_FAMILY(bl) \ + (((bl)->flags & UF2_FLAG_FAMILYID_PRESENT) == 0 || (bl)->familyID == UF2_FAMILY) + + + +typedef struct { + // 32 byte header + uint32_t magicStart0; + uint32_t magicStart1; + uint32_t flags; + uint32_t targetAddr; + uint32_t payloadSize; + uint32_t blockNo; + uint32_t numBlocks; + uint32_t familyID; + + // raw data; + uint8_t data[476]; + + // store magic also at the end to limit damage from partial block reads + uint32_t magicEnd; +} UF2_Block; + +typedef struct { + uint8_t version; + uint8_t ep_in; + uint8_t ep_out; + uint8_t reserved0; + uint32_t cbw_tag; + uint32_t blocks_remaining; + uint8_t *buffer; +} UF2_HandoverArgs; + +int write_block(uint32_t lba, const uint8_t *copy_from); +int read_block(uint32_t block_no, uint8_t *data); +void ghostfat_1ms(void); + +typedef void (*UF2_MSC_Handover_Handler)(UF2_HandoverArgs *handover); +typedef void (*UF2_HID_Handover_Handler)(int ep); + +// this is required to be exactly 16 bytes long by the linker script +typedef struct { + void *reserved0; + UF2_HID_Handover_Handler handoverHID; + UF2_MSC_Handover_Handler handoverMSC; + const char *info_uf2; +} UF2_BInfo; + +#define UF2_BINFO ((UF2_BInfo *)(APP_START_ADDRESS - sizeof(UF2_BInfo))) + +static inline bool is_uf2_block(const void *data) { + const UF2_Block *bl = (const UF2_Block *)data; + return bl->magicStart0 == UF2_MAGIC_START0 && bl->magicStart1 == UF2_MAGIC_START1 && + bl->magicEnd == UF2_MAGIC_END; +} + + +#endif |
