34 #include "libtock/net/lora_phy.h"
35 #include "libtock/net/syscalls/lora_phy_syscalls.h"
36 #include "libtock-sync/net/lora_phy.h"
37 #include "libtock/peripherals/gpio.h"
38 #include "libtock-sync/services/alarm.h"
39 #include "libtock/kernel/read_only_state.h"
46 #define RADIO_NSS RADIOLIB_NC
50 #define PIN_HIGH (0x1)
51 #define PIN_INPUT (0x01)
52 #define PIN_OUTPUT (0x03)
53 #define PIN_RISING (0x01)
54 #define PIN_FALLING (0x02)
56 typedef void (*gpioIrqFn)(void);
58 gpioIrqFn gpio_funcs[4] = { NULL, NULL, NULL, NULL};
59 uint32_t frequency = 0;
64 int alarm_internal_frequency(uint32_t* frequency) {
65 syscall_return_t rval = command(0x0, 1, 0, 0);
66 return tock_command_return_u32_to_returncode(rval, frequency);
69 int alarm_internal_read(uint32_t* time) {
70 syscall_return_t rval = command(0x0, 2, 0, 0);
71 return tock_command_return_u32_to_returncode(rval, time);
74 static void lora_phy_gpio_Callback (
int gpioPin,
75 __attribute__ ((unused))
int arg2,
76 __attribute__ ((unused))
int arg3,
79 gpioIrqFn fn = gpio_funcs[gpioPin - 1];
90 :
RadioLibHal(PIN_INPUT, PIN_OUTPUT, PIN_LOW, PIN_HIGH, PIN_RISING, PIN_FALLING) {
101 void pinMode(uint32_t pin, uint32_t mode)
override {
102 if(pin == RADIOLIB_NC) {
106 if (mode == PIN_OUTPUT) {
107 libtock_lora_phy_gpio_enable_output(pin);
108 }
else if (mode == PIN_INPUT) {
109 libtock_lora_phy_gpio_enable_input(pin, libtock_pull_down);
114 if(pin == RADIOLIB_NC) {
119 libtock_lora_phy_gpio_set(pin);
121 libtock_lora_phy_gpio_clear(pin);
128 if(pin == RADIOLIB_NC) {
132 libtock_lora_phy_gpio_read(pin, &value);
137 void attachInterrupt(uint32_t interruptNum, gpioIrqFn interruptCb, uint32_t mode)
override {
138 if(interruptNum == RADIOLIB_NC) {
142 gpio_funcs[interruptNum - 1] = interruptCb;
143 libtock_lora_phy_gpio_command_interrupt_callback(lora_phy_gpio_Callback, NULL);
146 libtock_lora_phy_gpio_enable_input(interruptNum, libtock_pull_down);
147 libtock_lora_phy_gpio_enable_interrupt(interruptNum, libtock_change);
151 if(interruptNum == RADIOLIB_NC) {
155 gpio_funcs[interruptNum - 1] = NULL;
156 libtock_lora_phy_gpio_disable_interrupt(interruptNum);
159 void delay(
unsigned long ms)
override {
160 #if !defined(RADIOLIB_CLOCK_DRIFT_MS)
161 libtocksync_alarm_delay_ms(ms);
163 libtocksync_alarm_delay_ms(ms * 1000 / (1000 + RADIOLIB_CLOCK_DRIFT_MS));
168 #if !defined(RADIOLIB_CLOCK_DRIFT_MS)
169 libtocksync_alarm_delay_ms(us / 1000);
171 libtocksync_alarm_delay_ms((us * 1000 / (1000 + RADIOLIB_CLOCK_DRIFT_MS)) / 1000);
179 if (frequency == 0) {
180 alarm_internal_frequency(&frequency);
183 alarm_internal_read(&now);
185 ms = now / (frequency / 1000);
187 #if !defined(RADIOLIB_CLOCK_DRIFT_MS)
190 return ms * 1000 / (1000 + RADIOLIB_CLOCK_DRIFT_MS);
198 long pulseIn(uint32_t pin, uint32_t state,
unsigned long timeout)
override {
209 libtocksync_lora_phy_read_write(out, in, len);
Hardware abstraction library base interface.
Definition: Hal.h:13
RadioLibHal(const uint32_t input, const uint32_t output, const uint32_t low, const uint32_t high, const uint32_t rising, const uint32_t falling)
Default constructor.
Definition: Hal.cpp:3
Definition: libtockHal.h:86
void spiBegin()
SPI initialization method.
Definition: libtockHal.h:202
void spiEnd()
SPI termination method.
Definition: libtockHal.h:215
unsigned long millis() override
Get number of milliseconds since start. Must be implemented by the platform-specific hardware abstrac...
Definition: libtockHal.h:175
uint32_t digitalRead(uint32_t pin) override
Digital read method. Must be implemented by the platform-specific hardware abstraction!
Definition: libtockHal.h:125
unsigned long micros() override
Get number of microseconds since start. Must be implemented by the platform-specific hardware abstrac...
Definition: libtockHal.h:194
long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override
Measure the length of incoming digital pulse in microseconds. Must be implemented by the platform-spe...
Definition: libtockHal.h:198
void term() override
Module termination method. This will be called by all radio modules when the destructor is called....
Definition: libtockHal.h:96
void spiTransfer(uint8_t *out, size_t len, uint8_t *in)
Method to transfer buffer over SPI.
Definition: libtockHal.h:208
void attachInterrupt(uint32_t interruptNum, gpioIrqFn interruptCb, uint32_t mode) override
Method to attach function to an external interrupt. Must be implemented by the platform-specific hard...
Definition: libtockHal.h:137
void yield()
Yield method, called from long loops in multi-threaded environment (to prevent blocking other threads...
Definition: libtockHal.h:218
void spiBeginTransaction()
Method to start SPI transaction.
Definition: libtockHal.h:205
void delay(unsigned long ms) override
Blocking wait function. Must be implemented by the platform-specific hardware abstraction!
Definition: libtockHal.h:159
void digitalWrite(uint32_t pin, uint32_t value) override
Digital write method. Must be implemented by the platform-specific hardware abstraction!
Definition: libtockHal.h:113
void init() override
Module initialization method. This will be called by all radio modules at the beginning of startup....
Definition: libtockHal.h:93
void detachInterrupt(uint32_t interruptNum) override
Method to detach function from an external interrupt. Must be implemented by the platform-specific ha...
Definition: libtockHal.h:150
void delayMicroseconds(unsigned long us) override
Blocking microsecond wait function. Must be implemented by the platform-specific hardware abstraction...
Definition: libtockHal.h:167
void pinMode(uint32_t pin, uint32_t mode) override
GPIO pin mode (input/output/...) configuration method. Must be implemented by the platform-specific h...
Definition: libtockHal.h:101
void spiEndTransaction()
Method to end SPI transaction.
Definition: libtockHal.h:212