rp2040

RP2040 Programming without SDK
Log | Files | Refs

commit 5d4346205579c591f5ff384acc66973ba3636769
parent f0f91891ad881b7820f338aef23a5fe90ea3a62e
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri,  7 Apr 2023 09:18:02 +0900

add bin2uf2.c

Diffstat:
Abin2uf2.c | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+), 0 deletions(-)

diff --git a/bin2uf2.c b/bin2uf2.c @@ -0,0 +1,110 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + + +size_t +fwrite32l(uint32_t d, FILE *f) +{ + int i; + uint8_t b; + for (i = 0; i < 32; i += 8) { + b = (uint8_t) (d >> i & 0xff); + fwrite(&b, 1, 1, f); + if (ferror(f)) { + fprintf(stderr, "Fwrite32l: write error.\n"); + return 0; + } + } + return 4; +} + +int +main(int argc, char *argv[]) +{ + FILE *src = NULL, *dst = NULL; + size_t sdata = 476; + int retnum = 0; + + uint32_t mag1 = 0x0A324655; + uint32_t mag2 = 0x9E5D5157; + uint32_t flags = 0x00002000; // familyID present + uint32_t saddr = 0x10000000; + uint32_t nbyte = 256; + uint32_t blk = 0; + uint32_t nblk = 0; + uint32_t famid = 0xe48bff56; + uint8_t data[sdata]; + uint32_t mag3 = 0x0AB16F30; + + if (argc != 3) { + fprintf(stderr, "Usage: %s src dst\n", argv[0]); + exit(1); + } + + if ((src = fopen(argv[1], "rb")) == NULL) { + fprintf(stderr, "Could not open %s.\n", argv[1]); + retnum = 1; + goto defer; + } + if ((dst = fopen(argv[2], "wb")) == NULL) { + fprintf(stderr, "Could not open %s.\n", argv[2]); + retnum = 1; + goto defer; + } + + while (!feof(src)) { + fwrite32l(mag1, dst); + fwrite32l(mag2, dst); + fwrite32l(flags, dst); + fwrite32l(saddr, dst); + fwrite32l(nbyte, dst); + fwrite32l(blk, dst); + fwrite32l(nblk, dst); // dammy + fwrite32l(famid, dst); + + memset(data, 0, sdata); + fread(data, 1, nbyte, src); + if (ferror(src)) { + fprintf(stderr, "Read error: %s.\n", argv[1]); + retnum = 1; + goto defer; + } + fwrite(data, 1, sdata, dst); + if (ferror(src)) { + fprintf(stderr, "Write error: %s.\n", argv[2]); + retnum = 1; + goto defer; + } + + fwrite32l(mag3, dst); + + saddr += nbyte; + blk++; + nblk++; + } + + for (int i = 0; i < nblk; i++) { + if (i == 0) + if (fseek(dst, 24, SEEK_SET) < 0) { + fprintf(stderr, "Seek error: %s.\n argv[2]"); + retnum = 1; + goto defer; + } + fwrite32l(nblk, dst); + if (i < nblk - 1) + if(fseek(dst, 512 - 4, SEEK_CUR) < 0){ + fprintf(stderr, "Seek error: %s.\n argv[2]"); + retnum = 1; + goto defer; + } + } + +defer: + if (src) + fclose(src); + if (dst) + fclose(dst); + return retnum; +}