-
Notifications
You must be signed in to change notification settings - Fork 507
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #480 from pimoroni/feature/wakeup
MicroPython: Early wakeup GPIO latch module.
- Loading branch information
Showing
26 changed files
with
706 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
SRC_DIR=$1 | ||
DST_DIR=$2 | ||
|
||
echo "Applying wakeup_gpio.patch" | ||
cd "$DST_DIR/../../lib/pico-sdk" | ||
git apply "$SRC_DIR/wakeup_gpio.patch" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
diff --git a/src/rp2_common/pico_runtime/runtime.c b/src/rp2_common/pico_runtime/runtime.c | ||
index 70dd3bb..b8c1ed0 100644 | ||
--- a/src/rp2_common/pico_runtime/runtime.c | ||
+++ b/src/rp2_common/pico_runtime/runtime.c | ||
@@ -17,6 +17,7 @@ | ||
#include "hardware/clocks.h" | ||
#include "hardware/irq.h" | ||
#include "hardware/resets.h" | ||
+#include "hardware/gpio.h" | ||
|
||
#include "pico/mutex.h" | ||
#include "pico/time.h" | ||
@@ -32,6 +33,21 @@ | ||
#include "pico/bootrom.h" | ||
#endif | ||
|
||
+// Pins to toggle on wakeup | ||
+#ifndef PICO_WAKEUP_PIN_MASK | ||
+#define PICO_WAKEUP_PIN_MASK ((0b1 << 10) | (0b1 << 25)) | ||
+#endif | ||
+ | ||
+// Direction | ||
+#ifndef PICO_WAKEUP_PIN_DIR | ||
+#define PICO_WAKEUP_PIN_DIR ((0b1 << 10) | (0b1 << 25)) | ||
+#endif | ||
+ | ||
+// Value | ||
+#ifndef PICO_WAKEUP_PIN_VALUE | ||
+#define PICO_WAKEUP_PIN_VALUE ((0b1 << 10) | (0b1 << 25)) | ||
+#endif | ||
+ | ||
extern char __StackLimit; /* Set by linker. */ | ||
|
||
uint32_t __attribute__((section(".ram_vector_table"))) ram_vector_table[48]; | ||
@@ -61,11 +77,18 @@ void runtime_install_stack_guard(void *stack_bottom) { | ||
| 0x10000000; // XN = disable instruction fetch; no other bits means no permissions | ||
} | ||
|
||
-void runtime_init(void) { | ||
+void runtime_user_init(void) { | ||
+ gpio_init_mask(PICO_WAKEUP_PIN_MASK); | ||
+ gpio_set_dir_masked(PICO_WAKEUP_PIN_MASK, PICO_WAKEUP_PIN_DIR); | ||
+ gpio_put_masked(PICO_WAKEUP_PIN_MASK, PICO_WAKEUP_PIN_VALUE); | ||
+} | ||
+ | ||
+void runtime_reset_peripherals(void) { | ||
// Reset all peripherals to put system into a known state, | ||
// - except for QSPI pads and the XIP IO bank, as this is fatal if running from flash | ||
// - and the PLLs, as this is fatal if clock muxing has not been reset on this boot | ||
// - and USB, syscfg, as this disturbs USB-to-SWD on core 1 | ||
+ | ||
reset_block(~( | ||
RESETS_RESET_IO_QSPI_BITS | | ||
RESETS_RESET_PADS_QSPI_BITS | | ||
@@ -86,7 +109,9 @@ void runtime_init(void) { | ||
RESETS_RESET_UART1_BITS | | ||
RESETS_RESET_USBCTRL_BITS | ||
)); | ||
+} | ||
|
||
+void runtime_init(void) { | ||
// pre-init runs really early since we need it even for memcpy and divide! | ||
// (basically anything in aeabi that uses bootrom) | ||
|
||
diff --git a/src/rp2_common/pico_standard_link/crt0.S b/src/rp2_common/pico_standard_link/crt0.S | ||
index b2992f6..6091e70 100644 | ||
--- a/src/rp2_common/pico_standard_link/crt0.S | ||
+++ b/src/rp2_common/pico_standard_link/crt0.S | ||
@@ -9,6 +9,8 @@ | ||
#include "hardware/regs/addressmap.h" | ||
#include "hardware/regs/sio.h" | ||
#include "pico/binary_info/defs.h" | ||
+#include "hardware/regs/resets.h" | ||
+#include "hardware/regs/rosc.h" | ||
|
||
#ifdef NDEBUG | ||
#ifndef COLLAPSE_IRQS | ||
@@ -225,6 +227,23 @@ _reset_handler: | ||
cmp r0, #0 | ||
bne hold_non_core0_in_bootrom | ||
|
||
+ // Increase ROSC frequency to ~48MHz (range 14.4 - 96) | ||
+ // Startup drops from ~160ms to ~32ms on Pico W MicroPython | ||
+ ldr r0, =(ROSC_BASE + ROSC_DIV_OFFSET) | ||
+ ldr r1, =0xaa2 | ||
+ str r1, [r0] | ||
+ | ||
+ ldr r1, =runtime_reset_peripherals | ||
+ blx r1 | ||
+ | ||
+ ldr r1, =runtime_user_init | ||
+ blx r1 | ||
+ | ||
+ // Read GPIO state for front buttons and store | ||
+ movs r3, 0xd0 // Load 0xd0 into r3 | ||
+ lsls r3, r3, 24 // Shift left 24 to get 0xd0000000 | ||
+ ldr r6, [r3, 4] // Load GPIO state (0xd0000004) into r6 | ||
+ | ||
// In a NO_FLASH binary, don't perform .data copy, since it's loaded | ||
// in-place by the SRAM load. Still need to clear .bss | ||
#if !PICO_NO_FLASH | ||
@@ -251,6 +270,10 @@ bss_fill_test: | ||
cmp r1, r2 | ||
bne bss_fill_loop | ||
|
||
+ // runtime_wakeup_gpio_state gets zero init above | ||
+ ldr r2, =runtime_wakeup_gpio_state // Load output var addr into r2 | ||
+ str r6, [r2] // Store r6 to r2 | ||
+ | ||
platform_entry: // symbol for stack traces | ||
// Use 32-bit jumps, in case these symbols are moved out of branch range | ||
// (e.g. if main is in SRAM and crt0 in flash) | ||
@@ -314,6 +337,19 @@ data_cpy_table: | ||
runtime_init: | ||
bx lr | ||
|
||
+.weak runtime_user_init | ||
+.type runtime_user_init,%function | ||
+.thumb_func | ||
+runtime_user_init: | ||
+ bx lr | ||
+ | ||
+.weak runtime_reset_peripherals | ||
+.type runtime_reset_peripherals,%function | ||
+.thumb_func | ||
+runtime_reset_peripherals: | ||
+ bx lr | ||
+ | ||
+ | ||
// ---------------------------------------------------------------------------- | ||
// If core 1 somehow gets into crt0 due to a spectacular VTOR mishap, we need to | ||
// catch it and send back to the sleep-and-launch code in the bootrom. Shouldn't | ||
@@ -345,3 +381,9 @@ __get_current_exception: | ||
.align 2 | ||
.equ HeapSize, PICO_HEAP_SIZE | ||
.space HeapSize | ||
+ | ||
+.section .data._reset_handler | ||
+.global runtime_wakeup_gpio_state | ||
+.align 4 | ||
+runtime_wakeup_gpio_state: | ||
+.word 0x00000000 | ||
\ No newline at end of file |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
{ | ||
"deploy": [ | ||
"../deploy.md" | ||
], | ||
"docs": "", | ||
"features": [ | ||
"Breadboard friendly", | ||
"Castellated Pads", | ||
"Micro USB", | ||
"WiFi" | ||
], | ||
"id": "rp2-pico-w", | ||
"images": [ | ||
"rp2-pico-w.jpg" | ||
], | ||
"mcu": "rp2040", | ||
"product": "Pico W", | ||
"thumbnail": "", | ||
"url": "https://www.raspberrypi.com/products/raspberry-pi-pico/", | ||
"vendor": "Raspberry Pi" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
include("../manifest.py") | ||
|
||
freeze("$(MPY_DIR)/tools", "upip.py") | ||
freeze("$(MPY_DIR)/tools", "upip_utarfile.py") | ||
|
||
if os.path.isdir(convert_path("$(MPY_LIB_DIR)")): | ||
freeze("$(MPY_LIB_DIR)/python-ecosys/urequests", "urequests.py") | ||
freeze("$(MPY_LIB_DIR)/micropython/umqtt.simple", "umqtt") |
8 changes: 8 additions & 0 deletions
8
micropython/_board/picow_enviro/PICO_W_ENVIRO/mpconfigboard.cmake
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# cmake file for Raspberry Pi Pico W | ||
set(MICROPY_BOARD PICO_W) | ||
|
||
set(MICROPY_PY_LWIP ON) | ||
set(MICROPY_PY_NETWORK_CYW43 ON) | ||
|
||
# Board specific version of the frozen manifest | ||
set(MICROPY_FROZEN_MANIFEST ${CMAKE_SOURCE_DIR}/boards/PICO_W_ENVIRO/manifest.py) |
25 changes: 25 additions & 0 deletions
25
micropython/_board/picow_enviro/PICO_W_ENVIRO/mpconfigboard.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// Board and hardware specific configuration | ||
#define MICROPY_HW_BOARD_NAME "Raspberry Pi Pico W" | ||
|
||
// todo: We need something to check our binary size | ||
#define MICROPY_HW_FLASH_STORAGE_BYTES (848 * 1024) | ||
|
||
// Enable networking. | ||
#define MICROPY_PY_NETWORK 1 | ||
|
||
// CYW43 driver configuration. | ||
#define CYW43_USE_SPI (1) | ||
#define CYW43_LWIP (1) | ||
#define CYW43_GPIO (1) | ||
#define CYW43_SPI_PIO (1) | ||
|
||
// For debugging mbedtls - also set | ||
// Debug level (0-4) 1=warning, 2=info, 3=debug, 4=verbose | ||
// #define MODUSSL_MBEDTLS_DEBUG_LEVEL 1 | ||
|
||
#define MICROPY_HW_PIN_CYW43_COUNT CYW43_WL_GPIO_COUNT | ||
#ifdef CYW43_WL_GPIO_LED_PIN | ||
#define MICROPY_HW_PIN_CYW43_LED_PIN_NUM CYW43_WL_GPIO_LED_PIN | ||
#endif | ||
|
||
#define MICROPY_HW_PIN_RESERVED(i) ((i) == CYW43_PIN_WL_HOST_WAKE || (i) == CYW43_PIN_WL_REG_ON) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
SRC_DIR=$1 | ||
DST_DIR=$2 | ||
|
||
echo "Applying wakeup_gpio.patch" | ||
cd "$DST_DIR/../../lib/pico-sdk" | ||
git apply "$SRC_DIR/wakeup_gpio.patch" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
/* | ||
* Copyright (c) 2022 Raspberry Pi (Trading) Ltd. | ||
* | ||
* SPDX-License-Identifier: BSD-3-Clause | ||
*/ | ||
|
||
// ----------------------------------------------------- | ||
// NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO | ||
// SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES | ||
// ----------------------------------------------------- | ||
|
||
// This header may be included by other board headers as "boards/pico.h" | ||
|
||
#ifndef _BOARDS_PICO_W_H | ||
#define _BOARDS_PICO_W_H | ||
|
||
// For board detection | ||
#define RASPBERRYPI_PICO_W | ||
|
||
// --- UART --- | ||
#ifndef PICO_DEFAULT_UART | ||
#define PICO_DEFAULT_UART 0 | ||
#endif | ||
#ifndef PICO_DEFAULT_UART_TX_PIN | ||
#define PICO_DEFAULT_UART_TX_PIN 0 | ||
#endif | ||
#ifndef PICO_DEFAULT_UART_RX_PIN | ||
#define PICO_DEFAULT_UART_RX_PIN 1 | ||
#endif | ||
|
||
// --- LED --- | ||
// no PICO_DEFAULT_LED_PIN - LED is on Wireless chip | ||
// no PICO_DEFAULT_WS2812_PIN | ||
|
||
// --- I2C --- | ||
#ifndef PICO_DEFAULT_I2C | ||
#define PICO_DEFAULT_I2C 0 | ||
#endif | ||
#ifndef PICO_DEFAULT_I2C_SDA_PIN | ||
#define PICO_DEFAULT_I2C_SDA_PIN 4 | ||
#endif | ||
#ifndef PICO_DEFAULT_I2C_SCL_PIN | ||
#define PICO_DEFAULT_I2C_SCL_PIN 5 | ||
#endif | ||
|
||
// --- SPI --- | ||
#ifndef PICO_DEFAULT_SPI | ||
#define PICO_DEFAULT_SPI 0 | ||
#endif | ||
#ifndef PICO_DEFAULT_SPI_SCK_PIN | ||
#define PICO_DEFAULT_SPI_SCK_PIN 18 | ||
#endif | ||
#ifndef PICO_DEFAULT_SPI_TX_PIN | ||
#define PICO_DEFAULT_SPI_TX_PIN 19 | ||
#endif | ||
#ifndef PICO_DEFAULT_SPI_RX_PIN | ||
#define PICO_DEFAULT_SPI_RX_PIN 16 | ||
#endif | ||
#ifndef PICO_DEFAULT_SPI_CSN_PIN | ||
#define PICO_DEFAULT_SPI_CSN_PIN 17 | ||
#endif | ||
|
||
// --- FLASH --- | ||
|
||
#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1 | ||
|
||
#ifndef PICO_FLASH_SPI_CLKDIV | ||
#define PICO_FLASH_SPI_CLKDIV 2 | ||
#endif | ||
|
||
#ifndef PICO_FLASH_SIZE_BYTES | ||
#define PICO_FLASH_SIZE_BYTES (2 * 1024 * 1024) | ||
#endif | ||
|
||
// note the SMSP mode pin is on WL_GPIO1 | ||
// #define PICO_SMPS_MODE_PIN | ||
|
||
#ifndef PICO_RP2040_B0_SUPPORTED | ||
#define PICO_RP2040_B0_SUPPORTED 0 | ||
#endif | ||
|
||
#ifndef PICO_RP2040_B1_SUPPORTED | ||
#define PICO_RP2040_B1_SUPPORTED 0 | ||
#endif | ||
|
||
#ifndef CYW43_PIN_WL_HOST_WAKE | ||
#define CYW43_PIN_WL_HOST_WAKE 24 | ||
#endif | ||
|
||
#ifndef CYW43_PIN_WL_REG_ON | ||
#define CYW43_PIN_WL_REG_ON 23 | ||
#endif | ||
|
||
#ifndef CYW43_WL_GPIO_COUNT | ||
#define CYW43_WL_GPIO_COUNT 3 | ||
#endif | ||
|
||
#ifndef CYW43_WL_GPIO_LED_PIN | ||
#define CYW43_WL_GPIO_LED_PIN 0 | ||
#endif | ||
|
||
#endif |
Oops, something went wrong.