93 lines
3.0 KiB
C
93 lines
3.0 KiB
C
/*
|
|
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef _PLATFORM_BOOTROM_H
|
|
#define _PLATFORM_BOOTROM_H
|
|
|
|
#include "pico.h"
|
|
|
|
/** \file bootrom.h
|
|
* \defgroup pico_bootrom pico_bootrom
|
|
* Access to functions and data in the RP2040 bootrom
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*! \brief Return a bootrom lookup code based on two ASCII characters
|
|
* \ingroup pico_bootrom
|
|
*
|
|
* These codes are uses to lookup data or function addresses in the bootrom
|
|
*
|
|
* \param c1 the first character
|
|
* \param c2 the second character
|
|
* \return the 'code' to use in rom_func_lookup() or rom_data_lookup()
|
|
*/
|
|
static inline uint32_t rom_table_code(uint8_t c1, uint8_t c2) {
|
|
return (((uint)c2) << 8u) | (uint)c1;
|
|
}
|
|
|
|
/*!
|
|
* \brief Lookup a bootrom function by code
|
|
* \ingroup pico_bootrom
|
|
* \param code the code
|
|
* \return a pointer to the function, or NULL if the code does not match any bootrom function
|
|
*/
|
|
void *rom_func_lookup(uint32_t code);
|
|
|
|
/*!
|
|
* \brief Lookup a bootrom address by code
|
|
* \ingroup pico_bootrom
|
|
* \param code the code
|
|
* \return a pointer to the data, or NULL if the code does not match any bootrom function
|
|
*/
|
|
void *rom_data_lookup(uint32_t code);
|
|
|
|
/*!
|
|
* \brief Helper function to lookup the addresses of multiple bootrom functions
|
|
* \ingroup pico_bootrom
|
|
*
|
|
* This method looks up the 'codes' in the table, and convert each table entry to the looked up
|
|
* function pointer, if there is a function for that code in the bootrom.
|
|
*
|
|
* \param table an IN/OUT array, elements are codes on input, function pointers on success.
|
|
* \param count the number of elements in the table
|
|
* \return true if all the codes were found, and converted to function pointers, false otherwise
|
|
*/
|
|
bool rom_funcs_lookup(uint32_t *table, unsigned int count);
|
|
|
|
typedef void __attribute__((noreturn)) (*reset_usb_boot_fn)(uint32_t, uint32_t);
|
|
|
|
/*!
|
|
* \brief Reboot the device into BOOTSEL mode
|
|
* \ingroup pico_bootrom
|
|
*
|
|
* This function reboots the device into the BOOTSEL mode ('usb boot").
|
|
*
|
|
* Facilities are provided to enable an "activity light" via GPIO attached LED for the USB Mass Storage Device,
|
|
* and to limit the USB interfaces exposed.
|
|
*
|
|
* \param usb_activity_gpio_pin_mask 0 No pins are used as per a cold boot. Otherwise a single bit set indicating which
|
|
* GPIO pin should be set to output and raised whenever there is mass storage activity
|
|
* from the host.
|
|
* \param disable_interface_mask value to control exposed interfaces
|
|
* - 0 To enable both interfaces (as per a cold boot)
|
|
* - 1 To disable the USB Mass Storage Interface
|
|
* - 2 To disable the USB PICOBOOT Interface
|
|
*/
|
|
static inline void __attribute__((noreturn)) reset_usb_boot(uint32_t usb_activity_gpio_pin_mask,
|
|
uint32_t disable_interface_mask) {
|
|
reset_usb_boot_fn func = (reset_usb_boot_fn) rom_func_lookup(rom_table_code('U', 'B'));
|
|
func(usb_activity_gpio_pin_mask, disable_interface_mask);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|