Helium Hotspot version firmware for RPi 3/4 + RAK2245 Pi HAT

Hi all,

We’ve just released a new firmware for RPi 3/4 + RAK2245 Pi HAT, but this firmware is not used for normal LoRaWAN. It is a Helium hotspot actually, and it can work on RPi 3/4 + RAK2245 Pi HAT, which means you can also use it on RAK7243 and RAK7244.
You can download the firmware from here:
https://downloads.rakwireless.com/en/LoRa/Helium-Hotsport/Firmware/
The only thing you need to do is flash this firmware into a 16G SD card and connect RPi with Internet according to the normal method you have ever used a new RPi.

Meanwhile, we’ve opened all source code of this firmware on Github:

2 Likes

Can you advise what would be the next steps for this to work? Is there a registration step? I completed the installation but nothing shows up on the helium site.

HI @txsrooster After installing this Git you can follow that guide from hellium https://developer.helium.com/hotspot/developer-setup/ just do not make the last part "Installing packet_forwarder and lora_gateway from Source " And keep in mind that the jsons are for 902-928 freq range.

Thanks. I’ll give this a try this morning.

I installed and then tried to start but not compiled?
Error with [email protected]:~/RAK2245_for_helium $ sudo ./start.sh
./start.sh: line 17: ./lora_pkt_fwd: No such file or directory

I have lora_pkt_fwd.c file…

Did you run ```
sudo ./install.sh

Yes I did. Here is my output - is there something that’s not working properly?

[email protected]:~/RAK2245_for_helium $ sudo ./install.sh

/opt/ttn-gateway /home/pi/RAK2245_for_helium

/opt/ttn-gateway/lora_gateway /opt/ttn-gateway /home/pi/RAK2245_for_helium

make all -e -C libloragw

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/libloragw’

gcc -c -O2 -Wall -Wextra -std=c99 -Iinc -I. src/loragw_spi.native.c -o obj/loragw_spi.o

ar rcs libloragw.a obj/loragw_hal.o obj/loragw_gps.o obj/loragw_reg.o obj/loragw_spi.o obj/loragw_aux.o obj/loragw_radio.o obj/loragw_fpga.o obj/loragw_lbt.o

gcc -O2 -Wall -Wextra -std=c99 -Iinc -I. -L. tst/test_loragw_spi.c -o test_loragw_spi -lloragw -lrt -lm

gcc -O2 -Wall -Wextra -std=c99 -Iinc -I. -L. tst/test_loragw_reg.c -o test_loragw_reg -lloragw -lrt -lm

gcc -O2 -Wall -Wextra -std=c99 -Iinc -I. -L. tst/test_loragw_hal.c -o test_loragw_hal -lloragw -lrt -lm

gcc -O2 -Wall -Wextra -std=c99 -Iinc -I. -L. tst/test_loragw_gps.c -o test_loragw_gps -lloragw -lrt -lm

gcc -O2 -Wall -Wextra -std=c99 -Iinc -I. -L. tst/test_loragw_cal.c -o test_loragw_cal -lloragw -lrt -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/libloragw’

make all -e -C util_pkt_logger

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/util_pkt_logger’

gcc -L…/libloragw obj/util_pkt_logger.o obj/parson.o -o util_pkt_logger -lloragw -lrt -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/util_pkt_logger’

make all -e -C util_spi_stress

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/util_spi_stress’

gcc -L…/libloragw obj/util_spi_stress.o -o util_spi_stress -lloragw -lrt -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/util_spi_stress’

make all -e -C util_tx_test

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/util_tx_test’

gcc -L…/libloragw obj/util_tx_test.o -o util_tx_test -lloragw -lrt -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/util_tx_test’

make all -e -C util_lbt_test

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/util_lbt_test’

gcc -L…/libloragw obj/util_lbt_test.o -o util_lbt_test -lloragw -lrt -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/util_lbt_test’

make all -e -C util_tx_continuous

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/util_tx_continuous’

gcc -L…/libloragw obj/util_tx_continuous.o -o util_tx_continuous -lloragw -lrt -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/util_tx_continuous’

make all -e -C util_spectral_scan

make[1]: Entering directory ‘/opt/ttn-gateway/lora_gateway/util_spectral_scan’

make[1]: Nothing to be done for ‘all’.

make[1]: Leaving directory ‘/opt/ttn-gateway/lora_gateway/util_spectral_scan’

/opt/ttn-gateway /home/pi/RAK2245_for_helium

/opt/ttn-gateway/packet_forwarder /opt/ttn-gateway /home/pi/RAK2245_for_helium

make all -e -C lora_pkt_fwd

make[1]: Entering directory ‘/opt/ttn-gateway/packet_forwarder/lora_pkt_fwd’

gcc -c -O2 -Wall -Wextra -std=c99 -Iinc -I. -D VERSION_STRING=""cat ../VERSION"" -I…/…/lora_gateway/libloragw/inc src/lora_pkt_fwd.c -o obj/lora_pkt_fwd.o

In file included from src/lora_pkt_fwd.c:50:

src/lora_pkt_fwd.c: In function ‘thread_down’:

src/lora_pkt_fwd.c:2543:25: warning: too many arguments for format [-Wformat-extra-args]

MSG(“WARNING: power for TX - %d exceeding maximum power - , use maximum power - %d\n”, txpkt.rf_power, txlut.lut[txlut.size - 1].rf_power, txlut.lut[txlut.size - 1].rf_power);

^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

inc/trace.h:27:29: note: in definition of macro ‘MSG’

#define MSG(args…) printf(args) /* message that is destined to the user */

^~~~

src/lora_pkt_fwd.c: In function ‘modify_os_time’:

src/lora_pkt_fwd.c:2705:15: warning: implicit declaration of function ‘settimeofday’; did you mean ‘gettimeofday’? [-Wimplicit-function-declaration]

int ret = settimeofday(&tv, NULL);

^~~~~~~~~~~~

gettimeofday

src/lora_pkt_fwd.c: In function ‘parse_gateway_configuration’:

src/lora_pkt_fwd.c:696:9: warning: ‘strncpy’ specified bound 64 equals destination size [-Wstringop-truncation]

strncpy(serv_addr, str, sizeof serv_addr);

^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

src/lora_pkt_fwd.c:753:9: warning: ‘strncpy’ specified bound 64 equals destination size [-Wstringop-truncation]

strncpy(gps_tty_path, str, sizeof gps_tty_path);

^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

gcc -L…/…/lora_gateway/libloragw obj/lora_pkt_fwd.o obj/parson.o obj/base64.o obj/jitqueue.o obj/timersync.o -o lora_pkt_fwd -lloragw -lrt -lpthread -lm

make[1]: Leaving directory ‘/opt/ttn-gateway/packet_forwarder/lora_pkt_fwd’

make all -e -C util_ack

make[1]: Entering directory ‘/opt/ttn-gateway/packet_forwarder/util_ack’

make[1]: Nothing to be done for ‘all’.

make[1]: Leaving directory ‘/opt/ttn-gateway/packet_forwarder/util_ack’

make all -e -C util_sink

make[1]: Entering directory ‘/opt/ttn-gateway/packet_forwarder/util_sink’

make[1]: Nothing to be done for ‘all’.

make[1]: Leaving directory ‘/opt/ttn-gateway/packet_forwarder/util_sink’

make all -e -C util_tx_test

make[1]: Entering directory ‘/opt/ttn-gateway/packet_forwarder/util_tx_test’

make[1]: Nothing to be done for ‘all’.

make[1]: Leaving directory ‘/opt/ttn-gateway/packet_forwarder/util_tx_test’

/opt/ttn-gateway /home/pi/RAK2245_for_helium

/home/pi/RAK2245_for_helium

This answer is directed to the instructions at https://github.com/RAKWireless/RAK2245_for_helium


"sudo ./install.sh" in RAK2245_for_helium does the following automatically:
1.https://developer.helium.com/hotspot/developer-setup#installing-packet_forwarder-and-lora_gateway-from-source
2.https://developer.helium.com/hotspot/developer-setup#one-quick-change
3.https://developer.helium.com/hotspot/developer-setup#compile-the-packet_forwarder-and-lora_gateway

After successfully executing sudo ./install.sh, you need to restart the gateway, and lora_pkt_fwd will automatically run in the background.

miner requires you to refer to https://developer.helium.com/hotspot/developer-setup for installation.
miner needs to be run manually every restart.


Do I need to load the genesis block after every restart? Do i need to execute $sudo ./start.sh ???

If you use the firmware provided by RAK, you don’t need to load the genesis block after every restart.

So steps would be:

  1. Use “sudo raspi-config” command, enable spi and i2c interface. (This is persistent - I don’t have to enable this every time correct?)
  2. Execute the following. (do I need to $sudo ./start.sh ??)
    $ sudo apt update; sudo apt install git -y
    $ git clone https://github.com/RAKWireless/RAK2245_for_helium.git ~/RAK2245_for_helium
    $ cd ~/RAK2245_for_helium
    $ sudo ./install.sh
  3. $ sudo reboot
  4. $ _build/prod/rel/miner/bin/miner start

Questions:

  • I do not need to load genesis file - correct?
  • Do I need to complete the following or is that included in your RAK2245 firmware? I thought it was???

One Quick Change

Go into the file we pulled from https://github.com/Lora-net/lora_gateway/blob/master/libloragw/src/loragw_spi.native.c and modify line 56 to read:

#define SPI_SPEED 2000000

Now we are ready to build.

Compile the packet_forwarder and lora_gateway

Go into the packet_forwarder directory and run:

$ ./compile.sh

Once that wraps up, we can just run:

$ ./lora_pkt_fwd

You can set it once, and you don’t need to set it again after restart.


No need to execute start.sh.


My test is that only need to execute _build/prod/rel/miner/bin/miner start after each gateway restart. Don’t do need to load genesis file every time.

1 Like