7
31
Fork
You've already forked blackmagic
23

Lattice ECP5 JTAG Support #2213

Merged
dragonmux merged 9 commits from lethalbit/blackmagic:aki/ecp5-jtag into main 2026年04月25日 22:03:09 +02:00
Contributor
Copy link

Detailed description

This PR adds support for talking to Lattice ECP5 FPGAs

Currently only flashing the SPI flash attached to the FPGA via JTAG is supported, but eventually I want to get SRAM programming working as well, hence this being a draft PR

Your checklist for this pull request

## Detailed description This PR adds support for talking to Lattice ECP5 FPGAs Currently only flashing the SPI flash attached to the FPGA via JTAG is supported, but eventually I want to get SRAM programming working as well, hence this being a draft PR ## Your checklist for this pull request * [x] I've read the [Code of Conduct](https://codeberg.org/blackmagic-debug/blackmagic/src/CODE_OF_CONDUCT.md) * [x] I've read the [guidelines for contributing](https://codeberg.org/blackmagic-debug/blackmagic/src/CONTRIBUTING.md) to this repository * [x] It builds for hardware native (see [Building the firmware](https://codeberg.org/blackmagic-debug/blackmagic?tab=readme-ov-file#building-the-firmware)) * [x] It builds as BMDA (see [Building the BMDA](https://codeberg.org/blackmagic-debug/blackmagic?tab=readme-ov-file#building-black-magic-debug-app)) * [x] I've tested it to the best of my ability * [x] My commit messages provide a useful short description of what the commits do
lethalbit changed title from (削除) DRAFT: Lattice ECP5 JTAG Support (削除ここまで) to WIP: Lattice ECP5 JTAG Support 2026年03月18日 06:12:04 +01:00
dragonmux left a comment
Copy link

This is looking pretty great, there are just a small handful of things we note in review and with those addressed and your commit message prefix for the second commit adjusted (it'd be lattice_ecp5: , not target: ) this is shaping up nicely for merge.

This is looking pretty great, there are just a small handful of things we note in review and with those addressed and your commit message prefix for the second commit adjusted (it'd be `lattice_ecp5: `, not `target: `) this is shaping up nicely for merge.
@ -77,0 +77,4 @@
static inline uint64_t read_le8(const uint8_t *const buffer, const size_t offset)
{
uint8_t data[8U];
memcpy(data, buffer + offset, 4U);

This memcpy() wants to be for 8 bytes otherwise the upper 4 will be undefined value.

This `memcpy()` wants to be for 8 bytes otherwise the upper 4 will be undefined value.
lethalbit marked this conversation as resolved
@ -0,0 +66,4 @@
#define CMD_LSC_WRITE_ADDRESS 0xB4U
// Program the device the whole bitstream sent in as the command operand
#define CMD_LSC_BITSTREAM_BURST 0x7AU
// Write configuration data to the configuration memory frame at current address and post increment the address, Byte 2~0 of the opcode indicate number of the frames included in the operand field

This is an over-long line - please split this into two lines. Ideally please use the multi-line comment format

/*
 * This is a 
 * multi-line
 * comment
 */

and limit the line length to not more than 120 characters

This is an over-long line - please split this into two lines. Ideally please use the multi-line comment format ``` /* * This is a * multi-line * comment */ ``` and limit the line length to not more than 120 characters
lethalbit marked this conversation as resolved
@ -0,0 +40,4 @@
#include "lattice_common.h"
#include "lattice_ecp5.h"
#define REGISTER_FIELD(REG, MASK, SHIFT) (((REG) & ((MASK) << (SHIFT))) >> (SHIFT))

Please use lower-case in the parameter names - reg, mask, shift - upper case is reserved exclusively for macro names.

Please use lower-case in the parameter names - `reg`, `mask`, `shift` - upper case is reserved exclusively for macro names.
lethalbit marked this conversation as resolved
@ -0,0 +167,4 @@
typedef struct ecp5_device {
uint32_t idcode;
uint32_t bitstream_len;
uint16_t frame_len;

Does this have to be a uint16_t, or can it be a uint8_t, given the largest value stored appears to be 142?

Does this have to be a uint16_t, or can it be a uint8_t, given the largest value stored appears to be 142?
lethalbit marked this conversation as resolved
@ -0,0 +233,4 @@
target_s *target = target_new();
target->driver = "Lattice";
target->core = "ECP5";
target->priv = calloc(1, sizeof(ecp5_ctx_s));

This should really check that calloc() succeeds so we can not-crash if it fails - see

Lines 169 to 173 in 7fc79bf
stm32h5_flash_s *flash = calloc(1, sizeof(*flash));
if (!flash) { /* calloc failed: heap exhaustion */
DEBUG_ERROR("calloc: failed in %s\n", __func__);
return;
}

for an example of the general pattern for how we expect to go about this (same for the target_flash_s allocation below)

This should really check that `calloc()` succeeds so we can not-crash if it fails - see https://codeberg.org/blackmagic-debug/blackmagic/src/commit/7fc79bf954cfbb47d9916de2f6b6f76db7818396/src/target/stm32h5.c#L169-L173 for an example of the general pattern for how we expect to go about this (same for the target_flash_s allocation below)
lethalbit marked this conversation as resolved
@ -0,0 +289,4 @@
static bool ecp5_attach(target_s *const target)
{
const ecp5_ctx_s *ctx = (ecp5_ctx_s *)target->priv;

It's good that the thing ctx points to can't change, but why not the pointer itself being const? ie const ecp5_ctx_s *const ctx - it doesn't look like the ctx pointer itself can change, so might as well tell the compiler that.

It's good that the thing `ctx` points to can't change, but why not the pointer itself being `const`? ie `const ecp5_ctx_s *const ctx` - it doesn't look like the ctx pointer itself can change, so might as well tell the compiler that.
lethalbit marked this conversation as resolved
@ -0,0 +314,4 @@
} else
DEBUG_INFO("Flash identification failed\n");
ecp5_reset(target);

Why is it reset rather than exit_flash here? Some comments on the intent involved for the steps taken would be useful for the next person please.

Why is it `reset` rather than `exit_flash` here? Some comments on the intent involved for the steps taken would be useful for the next person please.
Author
Contributor
Copy link

This has to do with SRAM programming support and also that the ECP5, as far as I can tell, has no way to properly exit SPI passthrough mode.

I'll add a note about that, or just move the reset call into ecp5_exit_flash.

As an aisd ecp5_exit_flash, just ends up calling ecp5_detach which is a stub at the moment, the ecp5_reset was in ecp5_detach but as I was working on getting SRAM programming working, when we detached and reset the FPGA it would shred the bitstream that is programming in the SRAM and have it load from flash again, which is not what we want I don't think.

I also need figure out a way to differentiate when we enter flash mode for the attached SPI flash, or are writing to SRAM, as the flow of things needs to be somewhat different there. that's still a big WIP, so it's kinda messy at the moment.

This has to do with SRAM programming support and also that the ECP5, as far as I can tell, has no way to properly **exit** SPI passthrough mode. I'll add a note about that, or just move the reset call into `ecp5_exit_flash`. As an aisd `ecp5_exit_flash`, just ends up calling `ecp5_detach` which is a stub at the moment, the `ecp5_reset` *was* in `ecp5_detach` but as I was working on getting SRAM programming working, when we detached and reset the FPGA it would shred the bitstream that is programming in the SRAM and have it load from flash again, which is not what we want I don't think. I also need figure out a way to differentiate when we enter flash mode for the attached SPI flash, or are writing to SRAM, as the flow of things needs to be somewhat different there. that's still a big WIP, so it's kinda messy at the moment.
lethalbit marked this conversation as resolved
@ -0,0 +322,4 @@
static void ecp5_detach(target_s *const target)
{
const ecp5_ctx_s *ctx = (ecp5_ctx_s *)target->priv;
const uint8_t dev_index = ctx->device_index;

This routine appears to be a stub? what's its purpose - target->detach left NULL won't crash per the target API layer.

This routine appears to be a stub? what's its purpose - `target->detach` left NULL won't crash per the target API layer.
Author
Contributor
Copy link

This is a stub from my attempting to get pure SRAM programming working, and also likely needing to issue an FPGA reset when we detach the probe.

I can remove it for now, but it might come back if I end up needing it, I just kinda left a handful of stubs/dead code around like that, but if you really want to merge this in before SRAM is working and happy and things are fully ironed out then I can just cut all that out, i'm not partial one way or another.

This is a stub from my attempting to get pure SRAM programming working, and also likely needing to issue an FPGA reset when we detach the probe. I can remove it for now, but it might come back if I end up needing it, I just kinda left a handful of stubs/dead code around like that, but if you really want to merge this in before SRAM is working and happy and things are fully ironed out then I can just cut all that out, i'm not partial one way or another.
lethalbit marked this conversation as resolved
@ -0,0 +419,4 @@
for (size_t idx = 0; idx < length; ++idx) {
const uint8_t tap_in = reverse_bits(data_in[idx]);
jtag_proc.jtagtap_tdi_tdo_seq(&tap_out, (idx + 1) == length && !device->dr_postscan, &tap_in, 8);
if (idx % 8192) {

Please mark constants like this acting on unsigned values as U so there's no signed-unsigned conversion going on by accident. Please drop the {}'s here as they're superfluous as it's a single statement block.

Please mark constants like this acting on unsigned values as `U` so there's no signed-unsigned conversion going on by accident. Please drop the `{}`'s here as they're superfluous as it's a single statement block.
lethalbit marked this conversation as resolved
lethalbit force-pushed aki/ecp5-jtag from cd64da5ad8 to f4cbabbb35
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月18日 15:11:29 +02:00
Compare
lethalbit force-pushed aki/ecp5-jtag from f4cbabbb35
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to 287b0a7460
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月18日 23:12:13 +02:00
Compare
lethalbit force-pushed aki/ecp5-jtag from 287b0a7460
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to 759c81d755
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月20日 21:11:58 +02:00
Compare
lethalbit force-pushed aki/ecp5-jtag from 2a59fb5eb8
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to e08892fb91
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月21日 23:58:52 +02:00
Compare
lethalbit force-pushed aki/ecp5-jtag from e08892fb91
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to c1b48c3c73
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月24日 04:15:34 +02:00
Compare
lethalbit force-pushed aki/ecp5-jtag from c1b48c3c73
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to 4f5b33aca5
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
2026年04月24日 07:54:22 +02:00
Compare
lethalbit changed title from (削除) WIP: Lattice ECP5 JTAG Support (削除ここまで) to Lattice ECP5 JTAG Support 2026年04月24日 07:54:49 +02:00
Author
Contributor
Copy link

Split the SRAM stuff out into #2237 so the base support can get merged in and be functional more immediately.

Seeing as Codeberg/Forgejo don't support stacked PRs (can't blame them, they're kinda weird) it's a little hard to base one PR off of another cleanly in the UI, so the history for it will contain this PR's changes as well until it's merged in and #2237 can be rebased off of main.

Split the SRAM stuff out into #2237 so the base support can get merged in and be functional more immediately. Seeing as Codeberg/Forgejo don't support stacked PRs (can't blame them, they're kinda weird) it's a little hard to base one PR off of another cleanly in the UI, so the history for it will contain this PR's changes as well until it's merged in and #2237 can be rebased off of main.
lethalbit force-pushed aki/ecp5-jtag from 4f5b33aca5
Some checks are pending
ci/woodpecker/pr/build-firmware/1 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/2 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/3 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/4 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/5 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/6 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/7 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/8 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/9 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/10 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/11 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/12 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/13 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/14 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/15 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/16 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/17 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/18 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/19 Pipeline is pending approval
ci/woodpecker/pr/build-firmware/20 Pipeline is pending approval
ci/woodpecker/pr/build-linux/1 Pipeline is pending approval
ci/woodpecker/pr/build-linux/2 Pipeline is pending approval
ci/woodpecker/pr/build-windows Pipeline is pending approval
to 805c472283
Some checks failed
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
2026年04月24日 08:32:05 +02:00
Compare
dragonmux requested changes 2026年04月25日 21:08:47 +02:00
Dismissed
dragonmux left a comment
Copy link

This is looking quite a bit better. With this round of review notes addressed, we think this'll be ready to merge.

This is looking quite a bit better. With this round of review notes addressed, we think this'll be ready to merge.
@ -0,0 +191,4 @@
static void ecp5_spi_run_command(target_s *target, uint16_t command, target_addr_t address);
static void ecp5_spi_xfr_jtag(target_s *target, uint8_t *data_out, const uint8_t *data_in, size_t length);
static void free_ecp5_ctx(void *priv)

We'd suggest a small rename - ecp5_free_ctx or so - the consistency of ecp5_ being a prefix is important for general consistency. Please put this function below the handler so that handler is the first function in the file.

We'd suggest a small rename - `ecp5_free_ctx` or so - the consistency of `ecp5_` being a prefix is important for general consistency. Please put this function below the handler so that handler is the first function in the file.
lethalbit marked this conversation as resolved
@ -0,0 +225,4 @@
// Setup the command/data buffers
ctx->buffer_len = 4100U;
ctx->data_buffer = calloc(ctx->buffer_len, sizeof(uint8_t));
ctx->cmd_buffer = calloc(ctx->buffer_len, sizeof(uint8_t));

Please prefer to calloc(sizeof(uint8_t), ctx->buffer_len) - it'll lead to better performance of calloc because of how the parameters work.

Please prefer to `calloc(sizeof(uint8_t), ctx->buffer_len)` - it'll lead to better performance of calloc because of how the parameters work.

Braces can be dropped here and the if below as they're single-statement

Braces can be dropped here and the `if` below as they're single-statement
lethalbit marked this conversation as resolved
@ -0,0 +322,4 @@
static bool ecp5_exit_flash(target_s *const target)
{
/*
* NOTE(aki):

There's no need to do the (aki) thing here.. just simply "NB: " or "Note: " on the front of the first line of the note is absolutely fine.

There's no need to do the `(aki)` thing here.. just simply "NB: " or "Note: " on the front of the first line of the note is absolutely fine.
lethalbit marked this conversation as resolved
@ -0,0 +339,4 @@
void *const buffer, const size_t length)
{
const ecp5_ctx_s *ctx = (ecp5_ctx_s *)target->priv;
size_t off = 0U;

offset, please, rather than off - we have characters to spare, you can use them.

`offset`, please, rather than `off` - we have characters to spare, you can use them.
lethalbit marked this conversation as resolved
@ -0,0 +348,4 @@
}
const size_t dummy_len = (command & SPI_FLASH_DUMMY_MASK) >> SPI_FLASH_DUMMY_SHIFT;
for (size_t dummy = 0U; dummy < dummy_len; ++dummy) {

Same comment about single-line statement braces being droppable.

Same comment about single-line statement braces being droppable.
lethalbit marked this conversation as resolved
@ -0,0 +342,4 @@
size_t off = 0U;
ctx->cmd_buffer[off++] = SPI_FLASH_OPCODE(command);
if ((command & SPI_FLASH_OPCODE_MODE_MASK) == SPI_FLASH_OPCODE_3B_ADDR) {
ctx->cmd_buffer[off++] = (address & 0xFF0000U) >> 16U;

Please use lower case in hex constants. We need to get the lint pass going again on Codeberg CI, but this is a lint it would error on.

Please use lower case in hex constants. We need to get the `lint` pass going again on Codeberg CI, but this is a lint it would error on.
lethalbit marked this conversation as resolved
@ -0,0 +407,4 @@
data_out[idx] = reverse_bits8(tap_out);
}
DEBUG_PROTO("%s: %zu cycles\n", __func__, length);

Because this needs to work when built as firmware, we can't use %zu ( 😔 ) - so please use %" PRIu32 and (uint32_t) on length.

Because this needs to work when built as firmware, we can't use `%zu` ( 😔 ) - so please use `%" PRIu32` and `(uint32_t)` on `length`.
lethalbit marked this conversation as resolved
@ -0,0 +446,4 @@
tc_printf(target, "BSE Status:\n");
switch (ECP5_STATUS_BSE_ERROR(status_register)) {
case 0x0U:
tc_printf(target, " No Errors\n");

Please replace the spaces train with \t - aproximately same output, for less characters.

Please replace the spaces train with `\t` - aproximately same output, for less characters.
lethalbit marked this conversation as resolved
@ -0,0 +493,4 @@
#if CONFIG_LATTICE_ECP5_DECODE
tc_printf(target, "MSPI Clock Divider: %" PRIu32 "\n", ECP5_CTRL0_MSPI_CLK(control_register));
tc_printf(target, " Slew Rate: ");

Similar comment about spaces vs \t

Similar comment about spaces vs `\t`
lethalbit marked this conversation as resolved
@ -200,6 +201,18 @@ target_hc32 = declare_dependency(
dependencies:target_cortexm,
)
_target_lattice_defs=['-DCONFIG_LATTICE=1']

There's no need to prefix the variable with a _ - just calling it target_lattice_defs is absolutely fine.

There's no need to prefix the variable with a `_` - just calling it `target_lattice_defs` is absolutely fine.
lethalbit marked this conversation as resolved
lethalbit force-pushed aki/ecp5-jtag from 805c472283
Some checks failed
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
to 31248e1c44
Some checks failed
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
2026年04月25日 21:33:50 +02:00
Compare
lethalbit force-pushed aki/ecp5-jtag from 31248e1c44
Some checks failed
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
to 762b270029
Some checks failed
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/push/build-firmware/3 Pipeline was successful
ci/woodpecker/push/build-firmware/1 Pipeline was successful
ci/woodpecker/push/build-firmware/2 Pipeline was successful
ci/woodpecker/push/build-firmware/6 Pipeline was successful
ci/woodpecker/push/build-firmware/4 Pipeline was successful
ci/woodpecker/push/build-firmware/5 Pipeline was successful
ci/woodpecker/push/build-firmware/9 Pipeline was successful
ci/woodpecker/push/build-firmware/8 Pipeline was successful
ci/woodpecker/push/build-firmware/7 Pipeline was successful
ci/woodpecker/push/build-firmware/10 Pipeline was successful
ci/woodpecker/push/build-firmware/11 Pipeline was successful
ci/woodpecker/push/build-firmware/12 Pipeline was successful
ci/woodpecker/push/build-firmware/13 Pipeline was successful
ci/woodpecker/push/build-firmware/14 Pipeline was successful
ci/woodpecker/push/build-firmware/15 Pipeline was successful
ci/woodpecker/push/build-firmware/18 Pipeline failed
ci/woodpecker/push/build-firmware/17 Pipeline was successful
ci/woodpecker/push/build-firmware/16 Pipeline was successful
ci/woodpecker/push/build-linux/1 Pipeline was successful
ci/woodpecker/push/build-firmware/20 Pipeline was successful
ci/woodpecker/push/build-firmware/19 Pipeline was successful
ci/woodpecker/push/build-linux/2 Pipeline was successful
ci/woodpecker/push/build-windows Pipeline was successful
2026年04月25日 21:52:14 +02:00
Compare
dragonmux left a comment
Copy link

LGTM, merging. Thank you for the contribution and getting support for reprogramming at least the attached Flash of ECP5 FPGAs working!

LGTM, merging. Thank you for the contribution and getting support for reprogramming at least the attached Flash of ECP5 FPGAs working!
Sign in to join this conversation.
No reviewers
Labels
Clear labels
BMD App
Black Magic Debug App (aka. PC hosted) (not firmware)
BMP Firmware
Black Magic Probe Firmware (not PC hosted software)
Bug
Confirmed bug
Build system
Build system
Can't reproduce
Maintainers can't reproduce this problem
CI
Continuous Integration System
Contribution wanted
User contributions welcome
Documentation
Project documentation
Draft
Work in progress draft
Duplicate
This issue or pull request already exists
Enhancement
General project improvement
Feedback wanted
Requires additional submitter feedback
Foreign Host Board
Non Native hardware to runing Black Magic firmware on
GDB
Issue/PR related to GDB
Good first issue
Good for newcommers
HwIssue Mitigation
Solving or mitigating a Hardware issue in Software
Information Needed
Maintainers need more information
NativeHardware
Official Black Magic Debug Hardware
New Host Board
New hardware to run Black Magic firmware on
New Target
New debug target
Off Topic
Something that does not involve the project in any way
Potential Bug
A potential, unconfirmed or very special circumstance bug
Regression
Bug caused by a regression
User Interest Needed
More user interest required before consideration
User Testing Needed
Looking for user testing reports
Won't fix
Outside of the project scope or works as intended
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
blackmagic-debug/blackmagic!2213
Reference in a new issue
blackmagic-debug/blackmagic
No description provided.
Delete branch "lethalbit/blackmagic:aki/ecp5-jtag"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?