mirror of
https://github.com/Klipper3d/klipper.git
synced 2025-08-07 05:54:05 -06:00
lib: Update rp2040_flash to upstream picotool.git v2.0.0
This is in preparation for adding rp2350 flash support. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
06bb49f135
commit
64ba37c02e
9 changed files with 877 additions and 78 deletions
94
lib/rp2040_flash/addresses.h
Normal file
94
lib/rp2040_flash/addresses.h
Normal file
|
@ -0,0 +1,94 @@
|
|||
#ifndef _ADDRESSES_H
|
||||
#define _ADDRESSES_H
|
||||
|
||||
#define ROM_START 0x00000000 // same as ROM_BASE in addressmap.h
|
||||
#define ROM_END_RP2040 0x00004000
|
||||
#define ROM_END_RP2350 0x00008000
|
||||
// todo amy based on what sort of elf (also this breaks RP2040 builds?)
|
||||
#define FLASH_START 0x10000000 // same as XIP_MAIN_BASE in addressmap.h
|
||||
#define FLASH_END_RP2040 0x11000000 // +32 MiB -- remainder has no external devices mapped
|
||||
#define FLASH_END_RP2350 0x12000000 // +32 MiB -- remainder has no external devices mapped
|
||||
// todo amy based on what sort of elf
|
||||
#define XIP_SRAM_START_RP2040 0x15000000
|
||||
#define XIP_SRAM_END_RP2040 0x15004000
|
||||
#define XIP_SRAM_START_RP2350 0x13ffc000 // same as XIP_SRAM_BASE in addressmap.h
|
||||
#define XIP_SRAM_END_RP2350 0x14000000 // same as XIP_SRAM_END in addressmap.h
|
||||
|
||||
#define SRAM_START 0x20000000 // same as SRAM_BASE in addressmap.h
|
||||
#define SRAM_END_RP2040 0x20042000
|
||||
#define SRAM_END_RP2350 0x20082000
|
||||
// todo amy no more banked alias
|
||||
#define MAIN_RAM_BANKED_START 0x21000000
|
||||
#define MAIN_RAM_BANKED_END 0x21040000
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
#ifdef _WIN32
|
||||
#undef IGNORE
|
||||
#endif
|
||||
|
||||
// Address ranges for RP2040/RP2350
|
||||
struct address_range {
|
||||
enum type {
|
||||
CONTENTS, // may have contents
|
||||
NO_CONTENTS, // must be uninitialized
|
||||
IGNORE // will be ignored
|
||||
};
|
||||
address_range(uint32_t from, uint32_t to, type type) : from(from), to(to), type(type) {}
|
||||
address_range() : address_range(0, 0, IGNORE) {}
|
||||
uint32_t from;
|
||||
uint32_t to;
|
||||
type type;
|
||||
};
|
||||
|
||||
typedef std::vector<address_range> address_ranges;
|
||||
|
||||
|
||||
const address_ranges rp2040_address_ranges_flash {
|
||||
address_range(FLASH_START, FLASH_END_RP2040, address_range::type::CONTENTS),
|
||||
address_range(SRAM_START, SRAM_END_RP2040, address_range::type::NO_CONTENTS),
|
||||
address_range(MAIN_RAM_BANKED_START, MAIN_RAM_BANKED_END, address_range::type::NO_CONTENTS)
|
||||
};
|
||||
|
||||
const address_ranges rp2040_address_ranges_ram {
|
||||
address_range(SRAM_START, SRAM_END_RP2040, address_range::type::CONTENTS),
|
||||
address_range(XIP_SRAM_START_RP2040, XIP_SRAM_END_RP2040, address_range::type::CONTENTS),
|
||||
address_range(ROM_START, ROM_END_RP2040, address_range::type::IGNORE) // for now we ignore the bootrom if present
|
||||
};
|
||||
|
||||
const address_ranges rp2350_address_ranges_flash {
|
||||
address_range(FLASH_START, FLASH_END_RP2350, address_range::type::CONTENTS),
|
||||
address_range(SRAM_START, SRAM_END_RP2350, address_range::type::NO_CONTENTS),
|
||||
address_range(MAIN_RAM_BANKED_START, MAIN_RAM_BANKED_END, address_range::type::NO_CONTENTS)
|
||||
};
|
||||
|
||||
const address_ranges rp2350_address_ranges_ram {
|
||||
address_range(SRAM_START, SRAM_END_RP2350, address_range::type::CONTENTS),
|
||||
address_range(XIP_SRAM_START_RP2350, XIP_SRAM_END_RP2350, address_range::type::CONTENTS),
|
||||
address_range(ROM_START, ROM_END_RP2350, address_range::type::IGNORE) // for now we ignore the bootrom if present
|
||||
};
|
||||
|
||||
static bool is_address_valid(const address_ranges& valid_ranges, uint32_t addr) {
|
||||
for(const auto& range : valid_ranges) {
|
||||
if (range.from <= addr && range.to > addr) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_address_initialized(const address_ranges& valid_ranges, uint32_t addr) {
|
||||
for(const auto& range : valid_ranges) {
|
||||
if (range.from <= addr && range.to > addr) {
|
||||
return address_range::type::CONTENTS == range.type;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue