blob: 7c0c460bd43595c93c3008719d62983e92a41c3d [file] [log] [blame] [view]
# Pigweed Experimental
[TOC]
This repository contains a variety experiments to help inform various Pigweed
policies, designs, and implementation behaviors.
Code in this repository is not reviewed to the standard of
[the main Pigweed repository](https://pigweed.googlesource.com/pigweed/pigweed),
and generally speaking is untested and maintained on a best-effort basis. This
is not a repository of "early access" Pigweed modules, but more so a sandbox for
Pigweed contributors to collaborate on investigations. For more information, see
the contribution guidelines for the
[experimental repository and where to land code](https://pigweed.dev/docs/contributing.html#experimental-repository-and-where-to-land-code).
**DO NOT DEPEND ON THIS REPOSITORY IN ANY PRODUCTION PROJECT!**
## Repository setup
Clone this repo with `--recursive` to get all required submodules.
```sh
git clone --recursive https://pigweed.googlesource.com/pigweed/experimental
```
This will pull the [Pigweed source
repository](https://pigweed.googlesource.com/pigweed/pigweed) into
`third_party/pigweed`. If you already cloned but forgot to `--recursive` run
`git submodule update --init` to pull all submodules.
## pw_graphics
The [//pw_graphics](/pw_graphics) folder contains some libraries for drawing to
an RGB565 framebuffer and displaying it on various platforms.
The demo applications that make use of these libraries are:
- [//applications/terminal_display](/applications/terminal_display)
### Build instructions
**First time setup:**
```
git clone --recursive https://pigweed.googlesource.com/pigweed/experimental
cd experimental
. ./bootstrap.sh
pw package install imgui
pw package install glfw
pw package install stm32cube_f4
pw package install pico_sdk
```
#### **[STM32F429-DISC1](https://www.st.com/en/evaluation-tools/32f429idiscovery.html)**
**Compile:**
```sh
gn gen out --export-compile-commands --args="
dir_pw_third_party_stm32cube_f4=\"$PW_PROJECT_ROOT/environment/packages/stm32cube_f4\"
"
ninja -C out
```
**Flash:**
```
openocd -f third_party/pigweed/targets/stm32f429i_disc1/py/stm32f429i_disc1_utils/openocd_stm32f4xx.cfg -c "program out/stm32f429i_disc1_stm32cube_debug/obj/applications/terminal_display/bin/terminal_demo.elf verify reset exit"
```
#### **[STM32F769-DISC0](https://www.st.com/en/evaluation-tools/32f769idiscovery.html)**
**First time setup:**
```
pw package install stm32cube_f7
```
**Compile:**
```sh
gn gen out --export-compile-commands --args="
dir_pw_third_party_stm32cube_f7=\"//environment/packages/stm32cube_f7\"
"
ninja -C out
```
**Flash:**
```
openocd -f targets/stm32f769i_disc0/py/stm32f769i_disc0_utils/openocd_stm32f7xx.cfg \
-c "program out/stm32f769i_disc0_debug/obj/applications/blinky/bin/blinky.elf verify reset exit"
```
#### **Linux, Windows or Mac**
**Compile:**
```sh
gn gen out --export-compile-commands --args="
dir_pw_third_party_imgui=\"$PW_PROJECT_ROOT/environment/packages/imgui\"
dir_pw_third_party_glfw=\"$PW_PROJECT_ROOT/environment/packages/glfw\"
"
ninja -C out
```
**Run:**
```
out/host_debug/obj/applications/terminal_display/bin/terminal_demo
```
#### ***CURRENTLY NOT WORKING (https://pwbug.dev/325649415)*** - **[Raspberry Pi Pico](https://www.raspberrypi.com/products/raspberry-pi-pico/) Connected to an external SPI display**
Working displays:
- [ILI9341](https://www.adafruit.com/?q=ili9341&sort=BestMatch)
- [Pico Display Pack 2.0 (ST7789)](https://shop.pimoroni.com/products/pico-display-pack-2-0)
**First time setup:**
```
pw package install pico_sdk
```
**Compile:**
```sh
gn gen out --export-compile-commands --args='
PICO_SRC_DIR="//environment/packages/pico_sdk"
'
ninja -C out
```
**Flash:**
- Using a uf2 file:
1. Reboot pico into BOOTSEL mode by holding the bootsel button on startup.
2. Copy `./out/rp2040/obj/applications/terminal_display/terminal_demo.uf2` to your Pi Pico.
- Using `picotool`:
1. Reboot pico into BOOTSEL mode by holding the bootsel button on startup. Or try forcing a reboot with `picotool`:
```sh
picotool reboot -f -u
```
2. Flash the elf or uf2 file and reboot.
```sh
picotool load ./out/rp2040/obj/applications/terminal_display/bin/terminal_demo.elf
picotool reboot
```
- Using a Pico Probe and openocd:
This requires installing the Raspberry Pi foundation's OpenOCD fork for the
Pico probe. More details including how to connect the two Pico boards is available at [Raspberry Pi Pico and RP2040 - C/C++ Part 2: Debugging with VS Code](https://www.digikey.com/en/maker/projects/raspberry-pi-pico-and-rp2040-cc-part-2-debugging-with-vs-code/470abc7efb07432b82c95f6f67f184c0)
**Install RaspberryPi's OpenOCD Fork:**
```sh
git clone https://github.com/raspberrypi/openocd.git \
--branch picoprobe \
--depth=1 \
--no-single-branch \
openocd-picoprobe
cd openocd-picoprobe
./bootstrap
./configure --enable-picoprobe --prefix=$HOME/apps/openocd --disable-werror
make -j2
make install
```
**Setup udev rules (Linux only):**
```sh
cat <<EOF > 49-picoprobe.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0004", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0004", MODE:="0666"
EOF
sudo cp 49-picoprobe.rules /usr/lib/udev/rules.d/49-picoprobe.rules
sudo udevadm control --reload-rules
```
**Flash the Pico:**
```sh
~/apps/openocd/bin/openocd -f ~/apps/openocd/share/openocd/scripts/interface/picoprobe.cfg -f ~/apps/openocd/share/openocd/scripts/target/rp2040.cfg -c 'program out/rp2040/obj/applications/terminal_display/bin/terminal_demo.elf verify reset exit'
```
**Launching gdb***
```sh
~/apps/openocd/bin/openocd -f ~/apps/openocd/share/openocd/scripts/interface/picoprobe.cfg -f ~/apps/openocd/share/openocd/scripts/target/rp2040.cfg
```
```sh
gdb-multiarch -ex "target remote :3333" -ex "set print pretty on" out/rp2040/obj/applications/terminal_display/bin/terminal_demo.elf
```
`arm-none-eabi-gdb` can be used in place of `gdb-multiarch` above.
#### **[MIMXRT595-EVK](https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/i-mx-rt595-evaluation-kit:MIMXRT595-EVK) Connected to an external MIPI display**
**Setup NXP SDK:**
1. Build a NXP SDK
2. Download SDK
3. Extract SDK's zip file to //environment/SDK_2_12_1_EVK-MIMXRT595
**Compile:**
```sh
gn gen out --export-compile-commands --args="
pw_MIMXRT595_EVK_SDK=\"//environment/SDK_2_12_1_EVK-MIMXRT595\"
pw_target_mimxrt595_evk_MANIFEST=\"//environment/SDK_2_12_1_EVK-MIMXRT595/EVK-MIMXRT595_manifest_v3_10.xml\"
pw_third_party_mcuxpresso_SDK=\"//targets/mimxrt595_evk:mimxrt595_sdk\"
"
ninja -C out
```
**Flash the MIMXRT595-EVK:**
Follow the instructions to flash the MIMXRT595-EVK with the SEGGER J-Link
firmware and using `arm-none-eabi-gdb` at
https://pigweed.dev/targets/mimxrt595_evk/target_docs.html#running-and-debugging.
#### Teensy 4.1 ####
https://www.pjrc.com/teensy/loader_cli.html
```bash
brew install teensy_loader_cli
```
```sh
OBJCOPY=/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-objcopy
INFILE=out/arduino_debug/obj/applications/terminal_display/bin/terminal_demo.elf
OUTFILE=foo.hex
$OBJCOPY -O ihex -R .eeprom -R .fuse -R .lock -R .signature $INFILE $OUTFILE
teensy_loader_cli --mcu=TEENSY41 -w -v $OUTFILE
```