From a780a8762b8f8255cbb0fd775610f0cddd32ff9b Mon Sep 17 00:00:00 2001 From: hathach Date: Sat, 23 Jan 2021 00:32:14 +0700 Subject: rp2040 better support multiple boards --- examples/device/board_test/CMakeLists.txt | 7 +- examples/rules.mk | 2 +- hw/bsp/rp2040/boards/raspberry_pi_pico/board.h | 46 +++++++ .../raspberry_pi_pico/board_raspberry_pi_pico.c | 143 --------------------- hw/bsp/rp2040/family.c | 143 +++++++++++++++++++++ 5 files changed, 194 insertions(+), 147 deletions(-) create mode 100644 hw/bsp/rp2040/boards/raspberry_pi_pico/board.h delete mode 100644 hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c create mode 100644 hw/bsp/rp2040/family.c diff --git a/examples/device/board_test/CMakeLists.txt b/examples/device/board_test/CMakeLists.txt index 62759c49c..f02f83f7b 100644 --- a/examples/device/board_test/CMakeLists.txt +++ b/examples/device/board_test/CMakeLists.txt @@ -20,15 +20,16 @@ pico_sdk_init() add_executable(${PROJECT}) -target_sources(${PROJECT} PRIVATE +target_sources(${PROJECT} PUBLIC src/main.c - "${TOP}/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c" + "${TOP}/hw/bsp/${FAMILY}/family.c" ) -target_include_directories(${PROJECT} PRIVATE +target_include_directories(${PROJECT} PUBLIC "src/" "${TOP}/hw" "${TOP}/src" + "${TOP}/hw/bsp/${FAMILY}/boards/${BOARD}" ) target_compile_definitions(${PROJECT} PUBLIC diff --git a/examples/rules.mk b/examples/rules.mk index b61af1d55..ab0373bac 100644 --- a/examples/rules.mk +++ b/examples/rules.mk @@ -37,7 +37,7 @@ monitor: else ifeq ($(FAMILY),rp2040) all: - [ -d $(BUILD) ] || cmake -S . -B $(BUILD) -DFAMILY=$(FAMILY) -DPICO_BUILD_DOCS=0 + [ -d $(BUILD) ] || cmake -S . -B $(BUILD) -DFAMILY=$(FAMILY) -DBOARD=$(BOARD) -DPICO_BUILD_DOCS=0 $(MAKE) -C $(BUILD) clean: diff --git a/hw/bsp/rp2040/boards/raspberry_pi_pico/board.h b/hw/bsp/rp2040/boards/raspberry_pi_pico/board.h new file mode 100644 index 000000000..61532d8cb --- /dev/null +++ b/hw/bsp/rp2040/boards/raspberry_pi_pico/board.h @@ -0,0 +1,46 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2021, Ha Thach (tinyusb.org) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * This file is part of the TinyUSB stack. + */ + +#ifndef BOARD_H_ +#define BOARD_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#define LED_PIN PICO_DEFAULT_LED_PIN +#define LED_STATE_ON 1 + +// Button pin is BOOTSEL which is flash CS pin + +#define BUTTON_BOOTSEL +#define BUTTON_STATE_ACTIVE 0 + +#ifdef __cplusplus + } +#endif + +#endif /* BOARD_H_ */ 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 deleted file mode 100644 index 606d9a04a..000000000 --- a/hw/bsp/rp2040/boards/raspberry_pi_pico/board_raspberry_pi_pico.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * This file is part of the TinyUSB stack. - */ - -#include "pico/stdlib.h" -#include "hardware/gpio.h" -#include "hardware/sync.h" -#include "hardware/structs/ioqspi.h" -#include "hardware/structs/sio.h" - -#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, GPIO_OUT); - - // Button - - // todo probably set up device mode? -#if TUSB_OPT_DEVICE_ENABLED - -#endif - -#if TUSB_OPT_HOST_ENABLED - // set portfunc to host !!! -#endif -} - -////--------------------------------------------------------------------+ -//// USB Interrupt Handler -////--------------------------------------------------------------------+ -//void USB_IRQHandler(void) -//{ -//#if CFG_TUSB_RHPORT0_MODE & OPT_MODE_HOST -// tuh_isr(0); -//#endif -// -//#if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE -// tud_int_handler(0); -//#endif -//} - -//--------------------------------------------------------------------+ -// Board porting API -//--------------------------------------------------------------------+ - -void board_led_write(bool state) -{ - gpio_put(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); -} - -uint32_t board_button_read(void) -{ - return BUTTON_STATE_ACTIVE == get_bootsel_button(); -} - -int board_uart_read(uint8_t* buf, int len) -{ - for(int i=0;iio[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; +} +#endif + +void board_init(void) +{ + setup_default_uart(); + gpio_init(LED_PIN); + 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 !!! +#endif +} + +////--------------------------------------------------------------------+ +//// USB Interrupt Handler +////--------------------------------------------------------------------+ +//void USB_IRQHandler(void) +//{ +//#if CFG_TUSB_RHPORT0_MODE & OPT_MODE_HOST +// tuh_isr(0); +//#endif +// +//#if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE +// tud_int_handler(0); +//#endif +//} + +//--------------------------------------------------------------------+ +// Board porting API +//--------------------------------------------------------------------+ + +void board_led_write(bool state) +{ + gpio_put(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); +} + +uint32_t board_button_read(void) +{ +#ifdef BUTTON_BOOTSEL + return BUTTON_STATE_ACTIVE == get_bootsel_button(); +#else + return 0; +#endif +} + +int board_uart_read(uint8_t* buf, int len) +{ + for(int i=0;i