4#if defined(RADIOLIB_BUILD_RPI_PICO)
10#include <pico/stdlib.h>
11#include "hardware/spi.h"
12#include "hardware/timer.h"
13#include "hardware/pwm.h"
14#include "hardware/clocks.h"
15#include "pico/multicore.h"
23 PicoHal(spi_inst_t *spiChannel, uint32_t misoPin, uint32_t mosiPin, uint32_t sckPin, uint32_t spiSpeed = 500 * 1000)
24 :
RadioLibHal(GPIO_IN, GPIO_OUT, 0, 1, GPIO_IRQ_EDGE_RISE, GPIO_IRQ_EDGE_FALL),
25 _spiChannel(spiChannel),
31 void init()
override {
36 void term()
override {
42 void pinMode(uint32_t pin, uint32_t mode)
override {
43 if (pin == RADIOLIB_NC) {
48 gpio_set_dir(pin, mode);
51 void digitalWrite(uint32_t pin, uint32_t value)
override {
52 if (pin == RADIOLIB_NC) {
56 gpio_put(pin, (
bool)value);
60 if (pin == RADIOLIB_NC) {
67 void attachInterrupt(uint32_t interruptNum,
void (*interruptCb)(
void), uint32_t mode)
override {
68 if (interruptNum == RADIOLIB_NC) {
72 gpio_set_irq_enabled_with_callback(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL,
true, (gpio_irq_callback_t)interruptCb);
76 if (interruptNum == RADIOLIB_NC) {
80 gpio_set_irq_enabled_with_callback(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL,
false, NULL);
83 void delay(
unsigned long ms)
override {
91 unsigned long millis()
override {
92 return to_ms_since_boot(get_absolute_time());
95 unsigned long micros()
override {
96 return to_us_since_boot(get_absolute_time());
99 long pulseIn(uint32_t pin, uint32_t state,
unsigned long timeout)
override {
100 if (pin == RADIOLIB_NC) {
105 uint32_t start = this->
micros();
106 uint32_t curtick = this->
micros();
109 if ((this->
micros() - curtick) > timeout) {
114 return (this->
micros() - start);
117 void tone(uint32_t pin,
unsigned int frequency,
unsigned long duration = 0)
override;
119 void noTone(uint32_t pin)
override {
120 multicore_reset_core1();
124 spi_init(_spiChannel, _spiSpeed);
125 spi_set_format(_spiChannel, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
127 gpio_set_function(_sckPin, GPIO_FUNC_SPI);
128 gpio_set_function(_mosiPin, GPIO_FUNC_SPI);
129 gpio_set_function(_misoPin, GPIO_FUNC_SPI);
134 void spiTransfer(uint8_t *out,
size_t len, uint8_t *in) {
135 spi_write_read_blocking(_spiChannel, out, in, len);
138 void yield()
override {
139 tight_loop_contents();
145 spi_deinit(_spiChannel);
150 spi_inst_t *_spiChannel;
Hardware abstraction library base interface.
Definition Hal.h:16
virtual uint32_t digitalRead(uint32_t pin)=0
Digital read method. Must be implemented by the platform-specific hardware abstraction!
virtual void yield()
Yield method, called from long loops in multi-threaded environment (to prevent blocking other threads...
Definition Hal.cpp:35
virtual void detachInterrupt(uint32_t interruptNum)=0
Method to detach function from an external interrupt. Must be implemented by the platform-specific ha...
virtual long pulseIn(uint32_t pin, uint32_t state, RadioLibTime_t timeout)=0
Measure the length of incoming digital pulse in microseconds. Must be implemented by the platform-spe...
virtual void spiEnd()=0
SPI termination method.
virtual void init()
Module initialization method. This will be called by all radio modules at the beginning of startup....
Definition Hal.cpp:17
virtual RadioLibTime_t millis()=0
Get number of milliseconds since start. Must be implemented by the platform-specific hardware abstrac...
virtual void digitalWrite(uint32_t pin, uint32_t value)=0
Digital write method. Must be implemented by the platform-specific hardware abstraction!
virtual void tone(uint32_t pin, unsigned int frequency, RadioLibTime_t duration=0)
Method to produce a square-wave with 50% duty cycle ("tone") of a given frequency at some pin.
Definition Hal.cpp:25
virtual RadioLibTime_t micros()=0
Get number of microseconds since start. Must be implemented by the platform-specific hardware abstrac...
virtual void spiEndTransaction()=0
Method to end SPI transaction.
virtual void noTone(uint32_t pin)
Method to stop producing a tone.
Definition Hal.cpp:31
virtual void spiBegin()=0
SPI initialization method.
virtual void delay(RadioLibTime_t ms)=0
Blocking wait function. Must be implemented by the platform-specific hardware abstraction!
virtual void term()
Module termination method. This will be called by all radio modules when the destructor is called....
Definition Hal.cpp:21
virtual void delayMicroseconds(RadioLibTime_t us)=0
Blocking microsecond wait function. Must be implemented by the platform-specific hardware abstraction...
virtual void spiBeginTransaction()=0
Method to start SPI transaction.
virtual void spiTransfer(uint8_t *out, size_t len, uint8_t *in)=0
Method to transfer buffer over SPI.
virtual void pinMode(uint32_t pin, uint32_t mode)=0
GPIO pin mode (input/output/...) configuration method. Must be implemented by the platform-specific h...
virtual void attachInterrupt(uint32_t interruptNum, void(*interruptCb)(void), uint32_t mode)=0
Method to attach function to an external interrupt. Must be implemented by the platform-specific hard...