RadioLib
Universal wireless communication library for Arduino
Loading...
Searching...
No Matches
PicoHal.h
1#ifndef PICO_HAL_H
2#define PICO_HAL_H
3
4#if defined(RADIOLIB_BUILD_RPI_PICO)
5
6// include RadioLib
7#include <RadioLib.h>
8
9// include the necessary Pico libraries
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"
16
17// create a new Raspberry Pi Pico hardware abstraction
18// layer using the Pico SDK
19// the HAL must inherit from the base RadioLibHal class
20// and implement all of its virtual methods
21class PicoHal : public RadioLibHal {
22public:
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),
26 _spiSpeed(spiSpeed),
27 _misoPin(misoPin),
28 _mosiPin(mosiPin),
29 _sckPin(sckPin){}
30
31 void init() override {
32 stdio_init_all();
33 spiBegin();
34 }
35
36 void term() override {
37 spiEnd();
38 }
39
40 // GPIO-related methods (pinMode, digitalWrite etc.) should check
41 // RADIOLIB_NC as an alias for non-connected pins
42 void pinMode(uint32_t pin, uint32_t mode) override {
43 if (pin == RADIOLIB_NC) {
44 return;
45 }
46
47 gpio_init(pin);
48 gpio_set_dir(pin, mode);
49 }
50
51 void digitalWrite(uint32_t pin, uint32_t value) override {
52 if (pin == RADIOLIB_NC) {
53 return;
54 }
55
56 gpio_put(pin, (bool)value);
57 }
58
59 uint32_t digitalRead(uint32_t pin) override {
60 if (pin == RADIOLIB_NC) {
61 return 0;
62 }
63
64 return gpio_get(pin);
65 }
66
67 void attachInterrupt(uint32_t interruptNum, void (*interruptCb)(void), uint32_t mode) override {
68 if (interruptNum == RADIOLIB_NC) {
69 return;
70 }
71
72 gpio_set_irq_enabled_with_callback(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, (gpio_irq_callback_t)interruptCb);
73 }
74
75 void detachInterrupt(uint32_t interruptNum) override {
76 if (interruptNum == RADIOLIB_NC) {
77 return;
78 }
79
80 gpio_set_irq_enabled_with_callback(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, false, NULL);
81 }
82
83 void delay(unsigned long ms) override {
84 sleep_ms(ms);
85 }
86
87 void delayMicroseconds(unsigned long us) override {
88 sleep_us(us);
89 }
90
91 unsigned long millis() override {
92 return to_ms_since_boot(get_absolute_time());
93 }
94
95 unsigned long micros() override {
96 return to_us_since_boot(get_absolute_time());
97 }
98
99 long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override {
100 if (pin == RADIOLIB_NC) {
101 return 0;
102 }
103
104 this->pinMode(pin, GPIO_IN);
105 uint32_t start = this->micros();
106 uint32_t curtick = this->micros();
107
108 while (this->digitalRead(pin) == state) {
109 if ((this->micros() - curtick) > timeout) {
110 return 0;
111 }
112 }
113
114 return (this->micros() - start);
115 }
116
117 void tone(uint32_t pin, unsigned int frequency, unsigned long duration = 0) override;
118
119 void noTone(uint32_t pin) override {
120 multicore_reset_core1();
121 }
122
123 void spiBegin() {
124 spi_init(_spiChannel, _spiSpeed);
125 spi_set_format(_spiChannel, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
126
127 gpio_set_function(_sckPin, GPIO_FUNC_SPI);
128 gpio_set_function(_mosiPin, GPIO_FUNC_SPI);
129 gpio_set_function(_misoPin, GPIO_FUNC_SPI);
130 }
131
132 void spiBeginTransaction() {}
133
134 void spiTransfer(uint8_t *out, size_t len, uint8_t *in) {
135 spi_write_read_blocking(_spiChannel, out, in, len);
136 }
137
138 void yield() override {
139 tight_loop_contents();
140 }
141
142 void spiEndTransaction() {}
143
144 void spiEnd() {
145 spi_deinit(_spiChannel);
146 }
147
148private:
149 // the HAL can contain any additional private members
150 spi_inst_t *_spiChannel;
151 uint32_t _spiSpeed;
152 uint32_t _misoPin;
153 uint32_t _mosiPin;
154 uint32_t _sckPin;
155};
156
157#endif
158
159#endif
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...