linguini1 opened a new pull request, #15828:
URL: https://github.com/apache/nuttx/pull/15828

   ## Summary
   
   Add support for the RN903 and RN2483 family of LoRa radio transceivers. This 
initial support includes transmit and receive functionality and configuration 
and reading of radio parameters like frequency and bandwidth.
   
   ## Impact
   
   NuttX users can now use these radio transceivers!
   
   This changes touches the build system, wireless drivers and documentation. 
The documentation includes examples of how to use the driver and its available 
commands.
   
   ## Testing
   
   Testing was performed from an RP2040 based custom flight computer. The chip 
this code was tested again was the RN2903, but commands for both modules are 
the same. The only difference is the values allowed for each command, but the 
radio module does its own error checking so the driver code will not need to 
change between modules.
   
   The test script that was used to test the commands was:
   
   ```c
   #include <errno.h>
   #include <fcntl.h>
   #include <stdint.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/ioctl.h>
   #include <syslog.h>
   #include <unistd.h>
   
   #include <nuttx/wireless/lpwan/rn2xx3.h>
   
   #define handle_errno(msg, err)                                               
\
     if ((err) < 0)                                                             
\
       {                                                                        
\
         fprintf(stderr, msg ": %d\n", errno);                                  
\
         return EXIT_FAILURE;                                                   
\
       }
   
   int main(int argc, FAR char *argv[])
   {
     int err;
     int radio;
     int fd;
     int cnt;
     unsigned int num = 0;
     char ch;
     char line[MINMEA_MAX_LENGTH];
     char *port = "/dev/ttyS0";
   
     radio = open("/dev/rn2903", O_RDWR);
     if (radio < 0)
       {
         fprintf(stderr, "Couldn't open RN2903: %d\n", errno);
         return EXIT_FAILURE;
       }
   
     /* Set frequency */
   
     err = ioctl(radio, WLIOC_SETRADIOFREQ, 902400000);
     handle_errno("Couldn't set freq", err);
   
     /* Get frequency */
   
     uint32_t freq;
     err = ioctl(radio, WLIOC_GETRADIOFREQ, &freq);
     handle_errno("Couldn't get freq", err);
   
     printf("Frequency: %lu Hz\n", freq);
   
     /* Set TX power */
   
     float txpower = 12.0;
     err = ioctl(radio, WLIOC_SETTXPOWER, &txpower);
     handle_errno("Couldn't set txpwr", err);
   
     printf("Transmit power set to %.2f dBm\n", txpower);
   
     /* Get TX power */
   
     int8_t txpwr;
     err = ioctl(radio, WLIOC_GETTXPOWER, &txpwr);
     handle_errno("Couldn't get txpwr", err);
   
     printf("Tx power level: %d\n", txpwr);
   
     /* Get SNR */
   
     int8_t snr;
     err = ioctl(radio, WLIOC_GETSNR, &snr);
     handle_errno("Couldn't get snr", err);
   
     printf("SNR: %d\n", snr);
   
     /* Set preamble length */
   
     err = ioctl(radio, WLIOC_SETPRLEN, 8);
     handle_errno("Couldn't set prlen", err);
   
     /* Get preamble length */
   
     uint16_t prlen;
     err = ioctl(radio, WLIOC_GETPRLEN, &prlen);
     handle_errno("Couldn't get prlen", err);
   
     printf("Preamble length: %u\n", prlen);
   
     /* Set spread */
   
     err = ioctl(radio, WLIOC_SETSPREAD, 8);
     handle_errno("Couldn't set spread factor", err);
   
     /* Get spread */
   
     uint8_t spread;
     err = ioctl(radio, WLIOC_GETSPREAD, &spread);
     handle_errno("Couldn't get spread factor", err);
   
     printf("Spread factor: sf%u\n", spread);
   
     usleep(10000);
   
     /* Set modulation */
   
     err = ioctl(radio, WLIOC_SETMOD, RN2XX3_MOD_FSK);
     handle_errno("Couldn't set modulation", err);
   
     /* Get modulation */
   
     char modulation[10];
     err = ioctl(radio, WLIOC_GETMOD, modulation);
     handle_errno("Couldn't get modulation", err);
   
     printf("Modulation: %s\n", modulation);
   
     usleep(10000);
   
     /* Set bandwidth */
   
     uint32_t bandwidth = 250;
     err = ioctl(radio, WLIOC_SETBANDWIDTH, bandwidth);
     handle_errno("Couldn't set bw", err);
   
     /* Get bandwidth */
   
     err = ioctl(radio, WLIOC_GETBANDWIDTH, &bandwidth);
     handle_errno("Couldn't get bw", err);
   
     printf("Bandwidth: %lu kHz\n", bandwidth);
   
     return 0;
   }
   ```
   
   The output is:
   
   ```console
   nsh> hello
   Frequency: 902400000 Hz
   Transmit power set to 12.00 dBm
   Tx power level: 11
   SNR: -128
   Preamble length: 8
   Spread factor: sf8
   Modulation: fsk
   Bandwidth: 250 kHz
   nsh> 
   ```
   
   I also performed transmit/receive testing using a second RN2903 which I used 
to transmit/receive from a Python script. I was able to successfully receive 
messages sent from the NuttX driver, and I was also able to successfully 
receive messages with the NuttX driver sent from the Python script controlled 
transceiver.
   
   The code works with `read/write` functions, so it can be `echo`ed into or 
`cat`ted from to transmit and receive in the shell.
   
   Documentation was built locally and verified for correct render in the 
browser.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to