Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cpu/esp32: configurable linker scripts #19077

Merged

Conversation

gschorcht
Copy link
Contributor

@gschorcht gschorcht commented Dec 31, 2022

Contribution description

This PR provides configurable linker scripts for ESP32x SoCs.

Using the vendor memory.ld.in file and a sections.ld.in file instead of the static versions of these files, from which the actual used memory.ld and sections.ld are generated using the C preprocessor, allows to use the configuration in sdkconfig.h as well as Kconfig to define a custom memory layout. For example, it is no longer necessary to maintain different memory.ld files for the ESP32 BLE module, since the memory layout is now defined from the values of the configuration.

Note for the review: The memory.ld.in files are now simply copies of the manufacturer's memory.ld.in files. However, it is not possible to use the vendor's memory.ld.in files directly, because they have to be extended further on, e.g. for the periph_flashpage implementation.

This PR is prerequisite for the periph_flashpage support in PR #19079.

Testing procedure

Green CI.

Issues/PRs references

Prerequisite for PR #19079

@github-actions github-actions bot added Area: cpu Area: CPU/MCU ports Platform: ESP Platform: This PR/issue effects ESP-based platforms labels Dec 31, 2022
@gschorcht gschorcht added Type: enhancement The issue suggests enhanceable parts / The PR enhances parts of the codebase / documentation CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR labels Dec 31, 2022
@gschorcht gschorcht changed the title Cpu/esp32/configurable linker scripts cpu/esp32: configurable linker scripts Dec 31, 2022
@riot-ci
Copy link

riot-ci commented Dec 31, 2022

Murdock results

✔️ PASSED

8381cd3 cpu/esp32: using configurable linker scripts in makefiles

Success Failures Total Runtime
6765 0 6765 13m:56s

Artifacts

@gschorcht gschorcht force-pushed the cpu/esp32/configurable_linker_scripts branch 3 times, most recently from 53d6dd1 to c82e194 Compare December 31, 2022 13:17
The additional dependency of the ELFFILE variable on a LD_SCRIPTS variable allows to define rules for the generation of the used ld files from configurable LD templates.
Using the vendor `memory.ld.in` instead of a static `memory.ld`, from which the actual used `memory.ld` is generated with the C preprocessor, allows to use the configuration in `sdkconfig.h` as well as Kconfig to use a custom memory layout. For example, it is no longer necessary to maintain different `memory.ld` files for the ESP32 BLE module, since the memory layout is now defined from the values of the configuration.
Using `sectoins.ld.in` instead of a static `sections.ld`, from which the actual used `sections.ld` is generated with the C preprocessor, allows to use the configuration in `sdkconfig.h` as well as Kconfig to use a custom section layout.
@gschorcht gschorcht force-pushed the cpu/esp32/configurable_linker_scripts branch from c82e194 to 5b4a88a Compare December 31, 2022 14:31
@github-actions github-actions bot added the Area: build system Area: Build system label Dec 31, 2022
@gschorcht gschorcht force-pushed the cpu/esp32/configurable_linker_scripts branch 2 times, most recently from 7db1bfb to 590cb82 Compare December 31, 2022 15:02
@gschorcht gschorcht force-pushed the cpu/esp32/configurable_linker_scripts branch from 590cb82 to 8381cd3 Compare December 31, 2022 15:04
Copy link
Contributor

@benpicco benpicco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bors merge

@bors
Copy link
Contributor

bors bot commented Jan 2, 2023

Build succeeded!

And happy new year! 🎉

@bors bors bot merged commit 821acbe into RIOT-OS:master Jan 2, 2023
@gschorcht
Copy link
Contributor Author

@benpicco Thanks for reviewing and merging.

bors bot added a commit that referenced this pull request Jan 18, 2023
19079: cpu/esp32: add periph_flashpage support r=kaspar030 a=gschorcht

### Contribution description

This PR provides the `periph_flashpage` support for ESP32x SoCs.

For byte-aligned read access to constant data in the flash, the MMU of all ESP32x SoCs allows to map a certain number of 64 kByte pages of the flash into the data address space of the CPU. This address space is called DROM. Normally the whole DROM address space is assigned to the section `.rodata`. The default flash layout used by all ESP32x SoCs is:
| Address in Flash | Content |
|:-----------------------|:-----------|
| `0x0000` or `0x1000` | bootloader |
| `0x8000` | parition table |
| `0x9000` | `nvs` parition with WiFi data |
| `0xf000`  | `phy_init` partition with RF data |
| `0x10000` | `factory` partition with the app image |

The factory partition consists of a number of 64 kByte pages for the sections `.text`, `.rodata`, `.bss` and others. The `.text` and `rodata` sections are page-aligned and are simply mapped into the instruction address space (IROM) and the data address space (DROM), respectively. All other sections are loaded into RAM.

If the `periph_flashpage` module is used, the `periph_flashpage` driver
- decreases the size of the `.rodata` section in DROM address space by `CONFIG_ESP_FLASHPAGE_CAPACITY`,
- adds a section `.flashpage.writable` of size `CONFIG_ESP_FLASHPAGE_CAPACITY` at the end of DROM address space that is mapped into data address space of the CPU,
- reserves a region of size `CONFIG_ESP_FLASHPAGE_CAPACITY` starting from `0x10000` in front of the image partition `factory` and
- moves the image partition `factory` by  `CONFIG_ESP_FLASHPAGE_CAPACITY` to address `0x10000 + CONFIG_ESP_FLASHPAGE_CAPACITY`. 

The new flash layout is then:
| Address in Flash | Content |
|:-----------------------|:-----------|
| `0x0000` or `0x1000` | bootloader |
| `0x8000` | parition table |
| `0x9000` | `nvs` parition with WiFi data |
| `0xf000`  | `phy_init` partition with RF data |
| `0x10000` | flashpage region |
| `0x10000 + CONFIG_ESP_FLASHPAGE_CAPACITY` | `factory` partition with the app image |

This guarantees that the flash pages are not overwritten if a new app image with changed size is flashed. `CONFIG_ESP_FLASHPAGE_CAPACITY` has to be a multiple of 64 kBytes.

~The PR includes PR #19077 and PR #19078 for the moment to be compilable.~

### Testing procedure

The following tests should pass.
```
USEMODULE='esp_log_startup ps shell_cmds_default' BOARD=esp32-wroom-32 make -j8 -C tests/periph_flashpage flash term
```
```
USEMODULE='esp_log_startup ps shell_cmds_default' BOARD=esp32-wroom-32 make -j8 -C tests/mtd_flashpage flash term
```

### Issues/PRs references

Depends on PR #19077
Depends on PR #19078 


Co-authored-by: Gunar Schorcht <[email protected]>
@gschorcht gschorcht deleted the cpu/esp32/configurable_linker_scripts branch January 31, 2023 19:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: build system Area: Build system Area: cpu Area: CPU/MCU ports CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR Platform: ESP Platform: This PR/issue effects ESP-based platforms Type: enhancement The issue suggests enhanceable parts / The PR enhances parts of the codebase / documentation
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants