1717
1818#include " elf2uf2.h"
1919#include " errors.h"
20+ #include " model.h"
2021
2122#define FLASH_SECTOR_ERASE_SIZE 4096u
2223
@@ -156,11 +157,11 @@ bool check_abs_block(uf2_block block) {
156157 !(block.flags & UF2_FLAG_EXTENSION_FLAGS_PRESENT && *(uint32_t *)&(block.data [UF2_PAGE_SIZE]) != UF2_EXTENSION_RP2_IGNORE_BLOCK);
157158}
158159
159- int pages2uf2 (std::map<uint32_t , std::vector<page_fragment>>& pages, std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> out, uint32_t family_id, uint32_t abs_block_loc=0 ) {
160+ int pages2uf2 (std::map<uint32_t , std::vector<page_fragment>>& pages, std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> out, uint32_t family_id, model_t model, uint32_t abs_block_loc=0 ) {
160161 // RP2350-E10: add absolute block to start of flash UF2s, targeting end of flash by default
161- if (family_id != ABSOLUTE_FAMILY_ID && family_id != RP2040_FAMILY_ID && abs_block_loc) {
162+ if (family_id != ABSOLUTE_FAMILY_ID && model-> chip () == rp2350 && abs_block_loc) {
162163 uint32_t base_addr = pages.begin ()->first ;
163- address_ranges flash_range = rp2350_address_ranges_flash ;
164+ address_ranges flash_range = address_ranges_flash (model) ;
164165 if (is_address_initialized (flash_range, base_addr)) {
165166 uf2_block block = gen_abs_block (abs_block_loc);
166167 out->write ((char *)&block, sizeof (uf2_block));
@@ -196,7 +197,7 @@ int pages2uf2(std::map<uint32_t, std::vector<page_fragment>>& pages, std::shared
196197 return 0 ;
197198}
198199
199- int bin2uf2 (std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> out, uint32_t address, uint32_t family_id, uint32_t abs_block_loc, bool verbose) {
200+ int bin2uf2 (std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> out, uint32_t address, uint32_t family_id, model_t model, uint32_t abs_block_loc, bool verbose) {
200201 g_verbose = verbose;
201202 std::map<uint32_t , std::vector<page_fragment>> pages;
202203
@@ -232,10 +233,10 @@ int bin2uf2(std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> ou
232233 remaining -= len;
233234 }
234235
235- return pages2uf2 (pages, in, out, family_id, abs_block_loc);
236+ return pages2uf2 (pages, in, out, family_id, model, abs_block_loc);
236237}
237238
238- int elf2uf2 (std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> out, uint32_t family_id, uint32_t package_addr, uint32_t abs_block_loc, bool verbose) {
239+ int elf2uf2 (std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> out, uint32_t family_id, model_t model, uint32_t package_addr, uint32_t abs_block_loc, bool verbose) {
239240 elf_file source_file (verbose);
240241 g_verbose = verbose;
241242 elf_file *elf = &source_file;
@@ -244,14 +245,8 @@ int elf2uf2(std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> ou
244245 int rc = elf->read_file (in);
245246 bool ram_style = false ;
246247 address_ranges valid_ranges = {};
247- address_ranges flash_range; address_ranges ram_range;
248- if (family_id == RP2040_FAMILY_ID) {
249- flash_range = rp2040_address_ranges_flash;
250- ram_range = rp2040_address_ranges_ram;
251- } else {
252- flash_range = rp2350_address_ranges_flash;
253- ram_range = rp2350_address_ranges_ram;
254- }
248+ address_ranges flash_range = address_ranges_flash (model);
249+ address_ranges ram_range = address_ranges_ram (model);
255250 if (!rc) {
256251 rc = rp_determine_binary_type (elf->header (), elf->segments (), flash_range, ram_range, &ram_style);
257252 if (!rc) {
@@ -284,9 +279,9 @@ int elf2uf2(std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> ou
284279 }
285280 }
286281 uint32_t expected_ep = (UINT32_MAX != expected_ep_main_ram) ? expected_ep_main_ram : expected_ep_xip_sram;
287- if (eh.entry == expected_ep_xip_sram && family_id == RP2040_FAMILY_ID ) {
282+ if (eh.entry == expected_ep_xip_sram && model-> chip () == rp2040 ) {
288283 fail (ERROR_INCOMPATIBLE, " RP2040 B0/B1/B2 Boot ROM does not support direct entry into XIP_SRAM\n " );
289- } else if (eh.entry != expected_ep && family_id == RP2040_FAMILY_ID ) {
284+ } else if (eh.entry != expected_ep && model-> chip () == rp2040 ) {
290285 fail (ERROR_INCOMPATIBLE, " A RP2040 RAM binary should have an entry point at the beginning: %08x (not %08x)\n " , expected_ep, eh.entry );
291286 }
292287 static_assert (0 == (SRAM_START & (UF2_PAGE_SIZE - 1 )), " " );
@@ -344,5 +339,5 @@ int elf2uf2(std::shared_ptr<std::iostream> in, std::shared_ptr<std::iostream> ou
344339 }
345340 }
346341
347- return pages2uf2 (pages, in, out, family_id, abs_block_loc);
342+ return pages2uf2 (pages, in, out, family_id, model, abs_block_loc);
348343}
0 commit comments