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

Add RP2350 support #4459

Draft
wants to merge 15 commits into
base: dev
Choose a base branch
from
Draft

Add RP2350 support #4459

wants to merge 15 commits into from

Conversation

soypat
Copy link
Contributor

@soypat soypat commented Sep 8, 2024

Seeks to solve #4452.

Notes:

  • gen-device-svd.go Changed to support multiline Metadata descriptions such as the one found for the RP2350.
  • rp2350.ld takes rust version as reference. Ideally I'd like a minimal version, I've left it all in so people with more experience can note of what is required and what is "extra"
  • There's two packages, QFN-60 with 30 GPIOs and QFN80 with 48 GPIOs. I imagine we could expose all 48 GPIOs for the rp2350 and avoid making the distinction at the package level. Board would expose GP* pins.
  • Pico-sdk's second stage bootloader is spagghetified from what I can tell. Not sure which is the assembly we should be running... that said:
  • Likely candidate is boot2_generic_03h which is apparently what Rust uses. I've tried adding it as best as I could

Copy link

github-actions bot commented Sep 8, 2024

Size difference with the dev branch:

Binary size difference
not the same command!
    tinygo build -size short -o ./build/test.hex -target=feather-rp2040 ./examples/adafruit4650
    go: downloading tinygo.org/x/tinyfont v0.3.0
drivers/sizes-dev.txt has more commands than drivers/sizes-pr.txt
    tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/bh1750/main.go
 flash                          ram
 before   after   diff          before   after   diff
  16736   16736      0   0.00%    4308    4308      0   0.00% tinygo build -size short -o ./build/test.hex -target=feather-rp2040 ./examples/adafruit4650
  61012   61012      0   0.00%    6176    6176      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/adt7410/main.go
   9468    9468      0   0.00%    4740    4740      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/adxl345/main.go
  13424   13424      0   0.00%    6780    6780      0   0.00% tinygo build -size short -o ./build/test.hex -target=pybadge ./examples/amg88xx
   8580    8580      0   0.00%    4732    4732      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/apa102/main.go
  11584   11584      0   0.00%    6556    6556      0   0.00% tinygo build -size short -o ./build/test.hex -target=nano-33-ble ./examples/apds9960/proximity/main.go
   9668    9668      0   0.00%    4752    4752      0   0.00% tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/apa102/itsybitsy-m0/main.go
   8196    8196      0   0.00%    2304    2304      0   0.00% tinygo build -size short -o ./build/test.hex -target=microbit ./examples/at24cx/main.go
 138668  138668      0   0.00%   40348   40348      0   0.00%

@deadprogram
Copy link
Member

This is great @soypat thank you for getting going on it!

Please see tinygo-org/cmsis-svd-data#1 for some related supporting work.

@soypat
Copy link
Contributor Author

soypat commented Sep 8, 2024

Yes! I've looked at it and generated the device definitions. I just added a new commit with stubs for machine and runtime and am getting the following error during linking:

$ tinygo build -target=rp2350 -serial=none  examples/blinky1 
ld.lld: error: unable to insert .start_block after .vector_table
ld.lld: error: no memory region specified for section '.ARM.exidx'
ld.lld: error: no memory region specified for section '.text'

@deadprogram
Copy link
Member

I'm not too sure that the ld file you added will actually work with TinyGo. You probably need to have mostly the same symbols in same order as other platforms.

@soypat
Copy link
Contributor Author

soypat commented Sep 8, 2024

OK, blinky1 now compiles. I am afraid of flashing the resulting .uf2 😅

@soypat
Copy link
Contributor Author

soypat commented Sep 8, 2024

I've noticed the bootloader is not included in the build pipeline. I can write invalid assembly in it and everything still compiles...

Copy link

@rminnich rminnich left a comment

Choose a reason for hiding this comment

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

my main concerns:
absolutely, make sure serial out is functional
make sure panic works
empty functions should panic
make sure all that stuff in ldscript is right
#if should have no defaults, there should always be a value, and the default should be "something was not set that is expected to be set"

src/machine/machine_rp2350.go Outdated Show resolved Hide resolved
src/machine/machine_rp2350.go Outdated Show resolved Hide resolved
src/runtime/runtime_rp2350.go Show resolved Hide resolved
src/runtime/runtime_rp2350.go Show resolved Hide resolved
/* See Rust for a more complete reference: https://github.com/rp-rs/rp-hal/blob/main/rp235x-hal-examples/memory.x */
MEMORY
{
/* 2MiB safe default. */
Copy link

Choose a reason for hiding this comment

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

Are these known to match the machine hardware? This is one of the places you really want to get it right, or you'll be in Debug Hell forever.

sw a0, QMI_M0_RCMD_OFFSET(a3)
li a0, INIT_M0_RFMT
sw a0, QMI_M0_RFMT_OFFSET(a3)
#else
Copy link

Choose a reason for hiding this comment

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

I would make the #else have an actual value, #elseif arm and have the fallthrough #else do a #error. Maybe that's too picky, but I've been burned by default behavior.

@soypat
Copy link
Contributor Author

soypat commented Sep 10, 2024

@rminnich I'll leave all functions so far in panic("unimplemented") state. We should focus on getting the bootloader working and setting the LED pin high/low.

@soypat
Copy link
Contributor Author

soypat commented Sep 11, 2024

@deadprogram @aykevl I'm melding the RP2040 and RP2350 APIs... it's got some design decisions that some may consider questionable. I've managed to reuse a lot of logic between them at the cost of some magic constant weirdness. There are a few cases where code reuse was just not worth it though such as with the peripheral reset. Love to hear your input on how it is coming along.

@soypat
Copy link
Contributor Author

soypat commented Sep 14, 2024

OK I feel like I've gotten the hang of writing Cortex assembler and understand what is going on with the linker scripts. I cannot however get to the point of flashing the RP2350 correctly- after I flash it the RP2350 enters bootoader mode and appears as a mass storage device ready to get flashed again.

@soypat
Copy link
Contributor Author

soypat commented Sep 14, 2024

Aha, looks like things have changed since the RP2040. We now have to build a valid IMAGE_DEF, which is a binary blob with specific format.
image

@soypat
Copy link
Contributor Author

soypat commented Sep 15, 2024

Working on a a pico binary encoder/decoder https://github.com/soypat/picobin. Raspberry Pi's picotool is missing lots of features to inspect binaries, which makes sense- it's not designed to reverse engineer their stuff.

Also RP2350 documentation on pico binary layout is VERY lackluster compared to their hardware documentation so having code to describe the layout gives me confidence on what exactly is going on.

@soypat
Copy link
Contributor Author

soypat commented Sep 22, 2024

OK. I've run into a limitation of the debug/elf package. I need to patch the bootloader by extending its length. I'm thinking of adding a elf implementation that can get the job done to https://github.com/soypat/tinyboot.

Note: @aykevl This PR would add aforementioned tinyboot as a dependency of tinygo compiler. I'm in favor of third partying build tools so that others can use the package and find bugs in parallel to the TinyGo compiler.

Edit: progress here: https://github.com/soypat/tinyboot/tree/main/build/xelf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants