summaryrefslogtreecommitdiff
path: root/bootloader/Core/Src/uf2.h
diff options
context:
space:
mode:
authorStijn Kuipers <stijnkuipers@gmail.com>2023-06-29 16:26:07 +0200
committerStijn Kuipers <stijnkuipers@gmail.com>2023-06-29 16:26:07 +0200
commitfb5a321dd7c2848128b04b306f3e1e59c87a3f70 (patch)
treea8ef6273f9f331ebb1971a9baf20a8c897955612 /bootloader/Core/Src/uf2.h
parentbae7568fd4dd0676b370be8548c7ec95d6521ba1 (diff)
downloadplinky-fb5a321dd7c2848128b04b306f3e1e59c87a3f70.tar.gz
Initial Filedump
Tadaaa!!
Diffstat (limited to 'bootloader/Core/Src/uf2.h')
-rwxr-xr-xbootloader/Core/Src/uf2.h99
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