Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ App|Description
[dma_capture](adc/dma_capture) | Use the DMA to capture many samples from the ADC.
[read_vsys](adc/read_vsys) | Demonstrates how to read VSYS to get the voltage of the power supply.

### Binary Info

App|Description
---|---
[blink_any](binary_info/blink_any) | Uses `bi_ptr` variables to create a configurable blink binary - see the separate [README](binary_info/README.md) for more details
[hello_anything](binary_info/hello_anything) | Uses `bi_ptr` variables to create a configurable hello_world binary - see the separate [README](binary_info/README.md) for more details

### Bootloaders (RP2350 Only)
App|Description
---|---
Expand Down
2 changes: 2 additions & 0 deletions binary_info/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
add_subdirectory_exclude_platforms(blink_any)
add_subdirectory_exclude_platforms(hello_anything)
39 changes: 39 additions & 0 deletions binary_info/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
These programs demonstrate use of `bi_ptr` variables, which can be configured in a binary post-compilation using the `picotool config` command.

You can view the configurable variables with
```
$ picotool blink_any.uf2
File blink_any.uf2:

LED_PIN = 25
LED_TYPE = 0

$ picotool config hello_anything.uf2
File hello_anything.uf2:

use_usb = 1
uart_baud = 115200
uart_rx = 1
uart_tx = 0
uart_num = 0
use_uart = 1
text = "Hello, world!"
```

For example, to blink the LED on pin 7 instead of 25 use
```
$ picotool config blink_any.uf2 -s LED_PIN 7
File blink_any.uf2:

LED_PIN = 25
setting LED_PIN -> 7
```

Or to change the printed string use
```
$ picotool config hello_anything.uf2 -s text "Goodbye, world!"
File hello_anything.uf2:

text = "Hello, world!"
setting text -> "Goodbye, world!"
```
20 changes: 20 additions & 0 deletions binary_info/blink_any/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
if (NOT PICO_CYW43_SUPPORTED)
message("Only building blink_any for non W boards as PICO_CYW43_SUPPORTED is not set")
endif()

add_executable(blink_any
blink_any.c
)

# pull in common dependencies
target_link_libraries(blink_any pico_stdlib)

if (PICO_CYW43_SUPPORTED)
target_link_libraries(blink_any pico_cyw43_arch_none)
endif()

# create map/bin/hex file etc.
pico_add_extra_outputs(blink_any)

# add url via pico_set_program_url
example_auto_set_url(blink_any)
73 changes: 73 additions & 0 deletions binary_info/blink_any/blink_any.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

#include "pico/stdlib.h"
#include "pico/binary_info.h"

#ifdef CYW43_WL_GPIO_LED_PIN
#include "pico/cyw43_arch.h"
#endif

// Set an LED_TYPE variable - 0 is default, 1 is connected to WIFI chip
// Note that LED_TYPE == 1 is only supported when initially compiled for
// a board with PICO_CYW43_SUPPORTED (eg pico_w), else the required
// libraries won't be present
#if defined(PICO_DEFAULT_LED_PIN)
bi_decl(bi_ptr_int32(0x1234, 0x5678, LED_TYPE, 0));
bi_decl(bi_ptr_int32(0x1234, 0x5678, LED_PIN, PICO_DEFAULT_LED_PIN));
#elif defined(CYW43_WL_GPIO_LED_PIN)
bi_decl(bi_ptr_int32(0x1234, 0x5678, LED_TYPE, 1));
bi_decl(bi_ptr_int32(0x1234, 0x5678, LED_PIN, CYW43_WL_GPIO_LED_PIN));
#else
bi_decl(bi_ptr_int32(0x1234, 0x5678, LED_TYPE, 0));
bi_decl(bi_ptr_int32(0x1234, 0x5678, LED_PIN, 25));
#endif

#ifndef LED_DELAY_MS
#define LED_DELAY_MS 250
#endif

// Perform initialisation
int pico_led_init(void) {
if (LED_TYPE == 0) {
// A device like Pico that uses a GPIO for the LED so we can
// use normal GPIO functionality to turn the led on and off
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
return PICO_OK;
#ifdef CYW43_WL_GPIO_LED_PIN
} else if (LED_TYPE == 1) {
// For Pico W devices we need to initialise the driver etc
return cyw43_arch_init();
#endif
} else {
return PICO_ERROR_INVALID_DATA;
}
}

// Turn the led on or off
void pico_set_led(bool led_on) {
if (LED_TYPE == 0) {
// Just set the GPIO on or off
gpio_put(LED_PIN, led_on);
#ifdef CYW43_WL_GPIO_LED_PIN
} else if (LED_TYPE == 1) {
// Ask the wifi "driver" to set the GPIO on or off
cyw43_arch_gpio_put(LED_PIN, led_on);
#endif
}
}

int main() {
int rc = pico_led_init();
hard_assert(rc == PICO_OK);
while (true) {
pico_set_led(true);
sleep_ms(LED_DELAY_MS);
pico_set_led(false);
sleep_ms(LED_DELAY_MS);
}
}
20 changes: 20 additions & 0 deletions binary_info/hello_anything/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
if (TARGET tinyusb_device)
add_executable(hello_anything
hello_anything.c
)

# pull in common dependencies
target_link_libraries(hello_anything pico_stdlib)

# enable usb and uart output
pico_enable_stdio_usb(hello_anything 1)
pico_enable_stdio_uart(hello_anything 1)

# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(hello_anything)

# add url via pico_set_program_url
example_auto_set_url(hello_anything)
elseif(PICO_ON_DEVICE)
message("Skipping hello_anything because TinyUSB submodule is not initialized in the SDK")
endif()
36 changes: 36 additions & 0 deletions binary_info/hello_anything/hello_anything.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/uart.h"

int main() {
// stdio_uart configuration and initialisation
bi_decl(bi_ptr_int32(0x1234, 1, use_uart, 1));
bi_decl(bi_ptr_int32(0x1234, 2, uart_num, 0));
bi_decl(bi_ptr_int32(0x1234, 3, uart_tx, 0));
bi_decl(bi_ptr_int32(0x1234, 4, uart_rx, 1));
bi_decl(bi_ptr_int32(0x1234, 5, uart_baud, 115200));
if (use_uart) {
stdio_uart_init_full(UART_INSTANCE(uart_num), uart_baud, uart_tx, uart_rx);
}

// stdio_usb initialisation
bi_decl(bi_ptr_int32(0x1234, 6, use_usb, 1));
if (use_usb) {
stdio_usb_init();
}

// default printed string
bi_decl(bi_ptr_string(0x1234, 7, text, "Hello, world!", 256));

while (true) {
printf("%s\n", text);
sleep_ms(1000);
}
}