| # 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 |
| ``` |