Test SPI flash is readable
- Update hello_world to read the SPI flash chip ID in a loop.
- README
- Revised flashing instructions
- Add a pin map
- Update flash-with-blackmagic-probe.sh to reset after loading.
Bug: b/310962981
Change-Id: I772ef135bda1d1397d802a0e45aa5b82b556290a
Reviewed-on: https://pigweed-review.googlesource.com/c/gonk/+/177990
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Anthony DiGirolamo <tonymd@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Reviewed-by: Eric Holland <hollande@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index e14edf1..53fc8c2 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -35,8 +35,7 @@
"//applications/system_example(//targets/stm32f769i_disc0_stm32cube:stm32f769i_disc0_stm32cube.size_optimized)",
# Arduino targets
- "$dir_pw_status:status_test($dir_pigweed/targets/arduino:arduino_size_optimized)",
- "//applications/hello_world($dir_pigweed/targets/arduino:arduino_size_optimized)",
+ "//applications/spi_flash_test($dir_pigweed/targets/arduino:arduino_size_optimized)",
]
}
diff --git a/README.md b/README.md
index 06067c1..508ba95 100644
--- a/README.md
+++ b/README.md
@@ -40,9 +40,57 @@
The build commands are defined in: `//tools/gonk_tools/build_project.py`.
-## Run:
+## Gonk `spi_flash_test` Example
-### Host
+### Flash with `dfu-util`
+
+1. Create a bin file from the elf. This will be automated later.
+
+ ```sh
+ arm-none-eabi-objcopy -O binary \
+ ./out/gn/arduino_size_optimized/obj/applications/spi_flash_test/bin/spi_flash_test.elf \
+ ./out/gn/arduino_size_optimized/obj/applications/spi_flash_test/bin/spi_flash_test.bin
+ ```
+
+1. Unplug gonk from USB and replug with MODE button held down.
+
+1. Run dfu-util to flash.
+
+ ```sh
+ dfu-util -d 0483:df11 -s 0x08000000:leave \
+ --serial STM32FxSTM32 -a 0 \
+ -D ./out/gn/arduino_size_optimized/obj/applications/spi_flash_test/bin/spi_flash_test.bin
+ ```
+
+1. Unplug Gonk from USB and replug to reset the hardware. SPI bus issues have
+ been observed without this step.
+
+1. Connect over serial.
+
+ ```sh
+ python -m serial.tools.miniterm --raw /dev/ttyGonk 115200
+ ```
+
+ You should see output matching:
+
+ ```
+ --- Miniterm on /dev/ttyGonk 115200,8,N,1 ---
+ --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
+ INF Device id: 1f 84 1
+ INF Device id: 1f 84 1
+ INF Device id: 1f 84 1
+ INF Device id: 1f 84 1
+ ```
+
+
+### Flash with BlackMagic Probe:
+
+```sh
+./scripts/flash-with-blackmagic-probe.sh ./out/gn/arduino_size_optimized/obj/applications/spi_flash_test/bin/spi_flash_test.elf
+```
+
+## pw_system Example
+### Run on Host
Run the host app and connect to it via `pw-system-console`:
@@ -53,7 +101,7 @@
killall system_example
```
-### On device
+### Run on Device
Flashing
@@ -78,3 +126,34 @@
```sh
python -m pw_stm32cube_build gen_file_list third_party/stm32cube_f7
```
+
+# Pin Map
+
+## Misc
+
+| Net | STM32 Pin | STM32 Function | Function |
+|--------+-----------+----------------+----------|
+| STATUS | PB13 | GPIO_Output | STAT LED |
+
+## SPI Flash Connection
+
+| Net | STM32 Pin | STM32 Function | Flash Pin |
+|--------------|-----------|----------------|------------|
+| ICE_SPI_SS | PD2 | GPIO_Output | S# |
+| ICE_SPI_MISO | PB4 | SPI1_MISO | DQ1 |
+| ICE_SPI_MOSI | PB5 | SPI1_MOSI | DQ0 |
+| ICE_SPI_SCK | PB3 | SPI1_SCK | C |
+| FLASH_HOLD | PC11 | GPIO_Output | HOLD#/DQ3 |
+| FLASH_WP | PC12 | GPIO_Output | W#/VPP/DQ2 |
+
+## FPGA Connection
+
+| Net | Function | FPGA IO# | STM32 Pin | STM32 Function | Notes |
+|-------------------|----------|----------|-----------|-----------------|---------------------|
+| FPGA_IO_SPARE_0_2 | rst_i | 135 | PA0 | GPIO_Output | Active high |
+| FPGA_IO_SPARE_0_0 | mode_i | 137 | PB11 | GPIO_Output | FPGA operation mode |
+| FPGA_IO_SPARE_0_1 | valid_o | 136 | PB10 | GPIO_Output | Data/Transfer Valid |
+| DSPI_SCK | sclk_i | 76 | PB2 | QUADSPI_CLK | |
+| DSPI_CS | cs_n | 75 | PB6 | QUADSPI_BK1_NCS | |
+| DSPI_IO1 | mosi_i | 74 | PC10 | QUADSPI_BK1_IO1 | |
+| DSPI_IO0 | miso_i | 73 | PC9 | QUADSPI_BK1_IO0 | |
diff --git a/applications/hello_world/BUILD.gn b/applications/hello_world/BUILD.gn
deleted file mode 100644
index 3be9ef7..0000000
--- a/applications/hello_world/BUILD.gn
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2020 The Pigweed Authors
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not
-# use this file except in compliance with the License. You may obtain a copy of
-# the License at
-#
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations under
-# the License.
-
-import("//build_overrides/pigweed.gni")
-
-import("$dir_pw_arduino_build/arduino.gni")
-import("$dir_pw_build/target_types.gni")
-
-pw_executable("hello_world") {
- # Example of how to include Arduino style libraries:
- #
- # Common library arguments to the arduino_builder tool.
- # _library_args = [
- # "--library-path",
- # rebase_path("libraries"),
- # "--library-names",
- # "ExampleLibraryName",
- # ]
- #
- # _library_cpp_files = exec_script(
- # arduino_builder_script,
- # arduino_show_command_args + _library_args +
- # [ "--library-cpp-files" ],
- # "list lines"
- # )
- #
- # include_dirs = exec_script(
- # arduino_builder_script,
- # arduino_show_command_args + _library_args +
- # [ "--library-include-dirs" ],
- # "list lines"
- # )
-
- sources = [ "main.cc" ]
-
- deps = [
- "$dir_pw_log",
- "$dir_pw_string",
- "$dir_pw_third_party/arduino:arduino_core_sources",
- ]
-
- ldflags = [ "-Wl,--print-memory-usage" ]
-
- remove_configs = [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
-}
diff --git a/applications/hello_world/main.cc b/applications/hello_world/main.cc
deleted file mode 100644
index 390e6ca..0000000
--- a/applications/hello_world/main.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2023 The Pigweed Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#include <Arduino.h>
-#include <cstdint>
-
-#include "pw_log/log.h"
-#include "pw_string/format.h"
-
-int main() {
- char buffer[32];
- uint16_t update_count = 0;
-
- while (true) {
- pw::string::Format(buffer, "Message number: %u", update_count);
- PW_LOG_INFO("%s", buffer);
- delay(1000);
-
- update_count = (update_count + 1) % UINT16_MAX;
- }
-
- return 0;
-}
diff --git a/applications/spi_flash_test/BUILD.gn b/applications/spi_flash_test/BUILD.gn
new file mode 100644
index 0000000..69cb2f4
--- /dev/null
+++ b/applications/spi_flash_test/BUILD.gn
@@ -0,0 +1,38 @@
+# Copyright 2020 The Pigweed Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+import("//build_overrides/pigweed.gni")
+
+import("$dir_pw_arduino_build/arduino.gni")
+import("$dir_pw_build/target_types.gni")
+
+pw_executable("spi_flash_test") {
+ include_dirs = [ "//third_party/stm32duino/arduino-core/libraries/SPI/src" ]
+
+ sources = [
+ "//third_party/stm32duino/arduino-core/libraries/SPI/src/SPI.cpp",
+ "//third_party/stm32duino/arduino-core/libraries/SPI/src/utility/spi_com.c",
+ "main.cc",
+ ]
+
+ deps = [
+ "$dir_pw_log",
+ "$dir_pw_string",
+ "$dir_pw_third_party/arduino:arduino_core_sources",
+ ]
+
+ ldflags = [ "-Wl,--print-memory-usage" ]
+
+ remove_configs = [ "$dir_pw_toolchain/arm_gcc:enable_float_printf" ]
+}
diff --git a/applications/spi_flash_test/main.cc b/applications/spi_flash_test/main.cc
new file mode 100644
index 0000000..e1d9bef
--- /dev/null
+++ b/applications/spi_flash_test/main.cc
@@ -0,0 +1,90 @@
+// Copyright 2023 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include <Arduino.h>
+#include <cstdint>
+
+#include <SPI.h>
+
+#include "pw_log/log.h"
+#include "pw_string/format.h"
+
+// STM32 Port & pin // PCB NET Name
+const int ICE40Reset = PC13; // ICE_RST_N
+const int ICE40Done = PC8; // ICE_CDONE
+const int FlashCS = PD2; // ICE_SPI_SS
+const int FlashHold = PC11; // FLASH_HOLD
+const int FlashWP = PC12; // FLASH_WP
+const int FlashMOSI = PB5; // ICE_SPI_MOSI
+const int FlashMISO = PB4; // ICE_SPI_MOSI
+const int FlashCLK = PB3; // ICE_SPI_SCK
+const int StatusLed = PB13; // STATUS
+
+int main() {
+ Serial.begin(115200);
+
+ // Put FPGA in reset.
+ PW_LOG_INFO("Hold FPGA in reset");
+ pinMode(ICE40Reset, OUTPUT);
+ digitalWrite(ICE40Reset, LOW);
+ delay(10);
+
+ // Debug status LED
+ pinMode(StatusLed, OUTPUT);
+ digitalWrite(StatusLed, LOW);
+
+ // SPI pin definitions
+ pinMode(FlashCS, OUTPUT);
+ digitalWrite(FlashCS, HIGH);
+
+ SPI.setMISO(FlashMISO);
+ SPI.setMOSI(FlashMOSI);
+ SPI.setSCLK(FlashCLK);
+ SPI.begin();
+
+ char buffer[32];
+ uint16_t update_count = 0;
+ uint8_t manufacturer_id[4];
+
+ while (true) {
+
+ // Read the SPI Flash JEDEC ID.
+ manufacturer_id[0] = 0x9f;
+ manufacturer_id[1] = 0;
+ manufacturer_id[2] = 0;
+ manufacturer_id[3] = 0;
+ SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
+ digitalWrite(FlashCS, LOW);
+ SPI.transfer(manufacturer_id, 4);
+ digitalWrite(FlashCS, HIGH);
+ SPI.endTransaction();
+
+ pw::string::Format(buffer, "SPI Flash JEDEC ID: %x %x %x",
+ manufacturer_id[1], manufacturer_id[2],
+ manufacturer_id[3]);
+ PW_LOG_INFO("%s", buffer);
+ delay(1000);
+
+ update_count = (update_count + 1) % UINT16_MAX;
+
+ // Toggle status LED each loop.
+ if (update_count % 2 == 0) {
+ digitalWrite(StatusLed, HIGH);
+ } else {
+ digitalWrite(StatusLed, LOW);
+ }
+ }
+
+ return 0;
+}
diff --git a/scripts/flash-with-blackmagic-probe.sh b/scripts/flash-with-blackmagic-probe.sh
index df3248b..8b87f09 100755
--- a/scripts/flash-with-blackmagic-probe.sh
+++ b/scripts/flash-with-blackmagic-probe.sh
@@ -22,10 +22,13 @@
-ex "set confirm off" \
-ex "target extended-remote ${DEVBMP}" \
-ex "monitor version" \
- -ex "monitor tpwr enable" \
+ -ex "monitor tpwr disable" \
-ex "monitor swdp_scan" \
-ex "attach 1" \
-ex "load" \
-ex "compare-sections" \
-ex "kill" \
+ -ex "shell sleep 1" \
+ -ex "monitor reset" \
$@
+