summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2021-01-23 00:12:10 +0700
committerhathach <[email protected]>2021-01-23 00:12:10 +0700
commitb8847de8025c0be602c59f0fe28397b6e18a1651 (patch)
tree329f636ef69cd036cb36b2456797293c7bfa54d9
parentb6e9c42b0217124aaf47e1d65e4eac39c3d3d681 (diff)
get board_test running with pico on both led and button
-rw-r--r--examples/device/board_test/CMakeLists.txt31
-rw-r--r--hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c74
2 files changed, 88 insertions, 17 deletions
diff --git a/examples/device/board_test/CMakeLists.txt b/examples/device/board_test/CMakeLists.txt
index ee0d7ef58..62759c49c 100644
--- a/examples/device/board_test/CMakeLists.txt
+++ b/examples/device/board_test/CMakeLists.txt
@@ -4,13 +4,40 @@ cmake_minimum_required(VERSION 3.5)
set(TOP "../../..")
get_filename_component(TOP "${TOP}" REALPATH)
+set(PROJECT board_test)
+
# Check for -DFAMILY=
if(NOT DEFINED FAMILY)
message(FATAL_ERROR "Invalid FAMILY specified")
endif()
include(${TOP}/hw/bsp/${FAMILY}/family.cmake)
+project(${PROJECT})
+
+if(FAMILY STREQUAL "rp2040")
+
+pico_sdk_init()
+
+add_executable(${PROJECT})
+
+target_sources(${PROJECT} PRIVATE
+ src/main.c
+ "${TOP}/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c"
+)
-project(board_test)
+target_include_directories(${PROJECT} PRIVATE
+ "src/"
+ "${TOP}/hw"
+ "${TOP}/src"
+)
-include(${TOP}/hw/bsp/${FAMILY}/family_extra.cmake OPTIONAL)
+target_compile_definitions(${PROJECT} PUBLIC
+ CFG_TUSB_MCU=OPT_MCU_RP2040
+ CFG_TUSB_OS=OPT_OS_PICO
+)
+
+target_link_libraries(${PROJECT} pico_stdlib)
+
+pico_add_extra_outputs(${PROJECT})
+
+endif()
diff --git a/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c b/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c
index efdb54733..606d9a04a 100644
--- a/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c
+++ b/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c
@@ -25,21 +25,73 @@
*/
#include "pico/stdlib.h"
-#include "../board.h"
+#include "hardware/gpio.h"
+#include "hardware/sync.h"
+#include "hardware/structs/ioqspi.h"
+#include "hardware/structs/sio.h"
-#ifndef LED_PIN
-#define LED_PIN PICO_DEFAULT_LED_PIN
-#endif
+#include "bsp/board.h"
+
+#define LED_PIN PICO_DEFAULT_LED_PIN
+#define LED_STATE_ON 1
+
+// Button pin is BOOTSEL which is flash CS pin
+// #define BUTTON_PIN
+#define BUTTON_STATE_ACTIVE 0
+
+// This example blinks the Picoboard LED when the BOOTSEL button is pressed.
+//
+// Picoboard has a button attached to the flash CS pin, which the bootrom
+// checks, and jumps straight to the USB bootcode if the button is pressed
+// (pulling flash CS low). We can check this pin in by jumping to some code in
+// SRAM (so that the XIP interface is not required), floating the flash CS
+// pin, and observing whether it is pulled low.
+//
+// This doesn't work if others are trying to access flash at the same time,
+// e.g. XIP streamer, or the other core.
+
+bool __no_inline_not_in_flash_func(get_bootsel_button)() {
+ const uint CS_PIN_INDEX = 1;
+
+ // Must disable interrupts, as interrupt handlers may be in flash, and we
+ // are about to temporarily disable flash access!
+ uint32_t flags = save_and_disable_interrupts();
+
+ // Set chip select to Hi-Z
+ hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl,
+ GPIO_OVERRIDE_LOW << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB,
+ IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS);
+
+ // Note we can't call into any sleep functions in flash right now
+ for (volatile int i = 0; i < 1000; ++i);
+
+ // The HI GPIO registers in SIO can observe and control the 6 QSPI pins.
+ // Note the button pulls the pin *low* when pressed.
+ bool button_state = (sio_hw->gpio_hi_in & (1u << CS_PIN_INDEX));
+
+ // Need to restore the state of chip select, else we are going to have a
+ // bad time when we return to code in flash!
+ hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl,
+ GPIO_OVERRIDE_NORMAL << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB,
+ IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS);
+
+ restore_interrupts(flags);
+
+ return button_state;
+}
void board_init(void)
{
setup_default_uart();
gpio_init(LED_PIN);
- gpio_set_dir(LED_PIN, 1);
+ gpio_set_dir(LED_PIN, GPIO_OUT);
// Button
// todo probably set up device mode?
+#if TUSB_OPT_DEVICE_ENABLED
+
+#endif
#if TUSB_OPT_HOST_ENABLED
// set portfunc to host !!!
@@ -66,12 +118,12 @@ void board_init(void)
void board_led_write(bool state)
{
- gpio_put(LED_PIN, state);
+ gpio_put(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON));
}
uint32_t board_button_read(void)
{
- return 0;
+ return BUTTON_STATE_ACTIVE == get_bootsel_button();
}
int board_uart_read(uint8_t* buf, int len)
@@ -84,16 +136,8 @@ int board_uart_read(uint8_t* buf, int len)
int board_uart_write(void const * buf, int len)
{
-// UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
for(int i=0;i<len;i++) {
uart_putc(uart_default, ((char *)buf)[i]);
}
return 0;
}
-
-#if CFG_TUSB_OS == OPT_OS_NONE
-uint32_t board_millis(void)
-{
- return to_ms_since_boot(get_absolute_time());
-}
-#endif