USB HID bridge between SX127x device and PC GUI

Dependencies:   SX127x USBDevice mbed

/media/uploads/dudmuck/lora.png

This application is a USB bridge between SX1272 or SX1276 transceiver chip and PC GUI. You can use Freescale Freedom instead of an expensive Open4, or another board supported by USBHID. Later, you might then use the freedom board for your own firmware development.

The pre-existing PC GUI checks for product device name of USB device to match a specific string of text.

After you import this program, you will have your own private copy of USB HID driver.

Edit the file USBDevice -> USBHID -> USBHID.cpp:

modification to USB HID driver

/*uint8_t * USBHID::stringIproductDesc() {
    static uint8_t stringIproductDescriptor[] = {
        0x16,                                                       //bLength
        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
        'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device
    };
    return stringIproductDescriptor;
}*/

uint8_t * USBHID::stringIproductDesc() {
    static uint8_t stringIproductDescriptor[] = {
        0x18,                                                       //bLength
        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
        'S',0,'X',0,'1',0,'2',0,'x',0,'x',0,'E',0,'i',0,'g',0,'e',0,'r',0 //bString iProduct - HID device
    };
    return stringIproductDescriptor;
}

Revision:
1:d25ba61cd2f3
Parent:
0:f8bc33804548
Child:
2:d17ce14e02d7
--- a/main.cpp	Mon Apr 14 22:01:41 2014 +0000
+++ b/main.cpp	Wed Apr 30 23:06:39 2014 +0000
@@ -2,9 +2,15 @@
 #include "USBHID.h"
 #include "sx127x.h"
 
+//#define _DEBUG_ 
+
 //  pin:      3     8     1      7    10    12     5   20    18
 //           mosi, miso, sclk,   cs,  rst,  dio0, dio1, fctx, fcps 
 SX127x radio(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13, PTD4, PTC9, PTC8);
+#ifdef _DEBUG_
+    #include "sx127x_lora.h"
+    SX127x_lora lora(radio);
+#endif /* _DEBUG_ */
 
 //We declare a USBHID device. By default input and output reports are 64 bytes long.
 USBHID hid(64, 64, 0x47a, 0x0b);
@@ -109,7 +115,10 @@
             #endif /* _DEBUG_ */
             radio.init();   //SX1272Init( );
             // Set FSK modem ON
-            radio.SetLoRaOn( false ); //SX1272SetLoRaOn( false ); // Default radio setting
+            radio.set_opmode(RF_OPMODE_SLEEP);  
+            radio.RegOpMode.bits.LongRangeMode = 0;
+            radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);            
+            //radio.SetLoRaOn( false ); //SX1272SetLoRaOn( false ); // Default radio setting
             // Default answer settings
             break;
         case HID_SK_GET_VERSION:
@@ -360,7 +369,7 @@
 void
 printCodingRate(bool from_rx)
 {
-    uint8_t d = radio.getCodingRate(from_rx);
+    uint8_t d = lora.getCodingRate(from_rx);
     printf("CodingRate:");
     switch (d) {
         case 1: printf("4/5 "); break;
@@ -377,7 +386,7 @@
 #ifdef _DEBUG_
 void printHeaderMode()
 {
-    if (radio.getHeaderMode())
+    if (lora.getHeaderMode())
         printf("implicit ");
     else
         printf("explicit ");
@@ -387,11 +396,11 @@
 #ifdef _DEBUG_
 void printBw()
 {
-    uint8_t bw = radio.getBw();
+    uint8_t bw = lora.getBw();
     
     printf("Bw:");
     if (radio.type == SX1276) {
-        switch (radio.RegModemConfig.sx1276bits.Bw) {
+        switch (lora.RegModemConfig.sx1276bits.Bw) {
             case 0: printf("7.8KHz "); break;
             case 1: printf("10.4KHz "); break;
             case 2: printf("15.6KHz "); break;
@@ -402,10 +411,10 @@
             case 7: printf("125KHz "); break;
             case 8: printf("250KHz "); break;
             case 9: printf("500KHz "); break;
-            default: printf("%x ", radio.RegModemConfig.sx1276bits.Bw); break;
+            default: printf("%x ", lora.RegModemConfig.sx1276bits.Bw); break;
         }
     } else if (radio.type == SX1272) {
-        switch (radio.RegModemConfig.sx1272bits.Bw) {
+        switch (lora.RegModemConfig.sx1272bits.Bw) {
             case 0: printf("125KHz "); break;
             case 1: printf("250KHz "); break;
             case 2: printf("500KHz "); break;
@@ -419,28 +428,28 @@
 void printSf()
 {
     // spreading factor same between sx127[26]
-    printf("sf:%d ", radio.getSf());
+    printf("sf:%d ", lora.getSf());
 }
 #endif /* _DEBUG_ */
 
 #ifdef _DEBUG_
 void printTxContinuousMode()
 {
-    printf("TxContinuousMode:%d ", radio.RegModemConfig2.sx1276bits.TxContinuousMode);    // same for sx1272 and sx1276
+    printf("TxContinuousMode:%d ", lora.RegModemConfig2.sx1276bits.TxContinuousMode);    // same for sx1272 and sx1276
 }
 #endif /* _DEBUG_ */
 
 #ifdef _DEBUG_
 void printAgcAutoOn()
 {
-    printf("AgcAutoOn:%d", radio.getAgcAutoOn());
+    printf("AgcAutoOn:%d", lora.getAgcAutoOn());
 }
 #endif /* _DEBUG_ */
 
 #ifdef _DEBUG_
 void printRxPayloadCrcOn()
 {
-    bool on = radio.getRxPayloadCrcOn();
+    bool on = lora.getRxPayloadCrcOn();
     //printf("RxPayloadCrcOn:%s ", on ? "on" : "off");
     if (on)
         printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n");
@@ -456,29 +465,29 @@
 
     //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
     printf("\r\nIrqFlags:");
-    if (radio.RegIrqFlags.bits.CadDetected)
+    if (lora.RegIrqFlags.bits.CadDetected)
         printf("CadDetected ");
-    if (radio.RegIrqFlags.bits.FhssChangeChannel) {
+    if (lora.RegIrqFlags.bits.FhssChangeChannel) {
         //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
-        printf("FhssChangeChannel:%d ", radio.RegHopChannel.bits.FhssPresentChannel);
+        printf("FhssChangeChannel:%d ", lora.RegHopChannel.bits.FhssPresentChannel);
     }
-    if (radio.RegIrqFlags.bits.CadDone)
+    if (lora.RegIrqFlags.bits.CadDone)
         printf("CadDone ");
-    if (radio.RegIrqFlags.bits.TxDone)
+    if (lora.RegIrqFlags.bits.TxDone)
         printf("TxDone ");
-    if (radio.RegIrqFlags.bits.ValidHeader)
+    if (lora.RegIrqFlags.bits.ValidHeader)
         printf("ValidHeader ");
-    if (radio.RegIrqFlags.bits.PayloadCrcError)
+    if (lora.RegIrqFlags.bits.PayloadCrcError)
         printf("PayloadCrcError ");
-    if (radio.RegIrqFlags.bits.RxDone)
+    if (lora.RegIrqFlags.bits.RxDone)
         printf("RxDone ");  
-    if (radio.RegIrqFlags.bits.RxTimeout)
+    if (lora.RegIrqFlags.bits.RxTimeout)
         printf("RxTimeout ");
 
     printf("\r\n");
 
     if (clear)
-        radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet);
+        radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet);
 
 }
 #endif /* _DEBUG_ */
@@ -504,8 +513,8 @@
     
     // printing LoRa registers at 0x0d -> 0x3f
 
-    radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
-    radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
+    lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
+    lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
 
     printCodingRate(false); // false: transmitted coding rate
     printHeaderMode();
@@ -516,28 +525,28 @@
     printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT));
 
     // fifo ptrs:
-    radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
-    radio.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
+    lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
+    lora.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
     printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x",
         radio.read_reg(REG_LR_FIFOADDRPTR),
         radio.read_reg(REG_LR_FIFOTXBASEADDR),
         radio.read_reg(REG_LR_FIFORXBASEADDR),
-        radio.RegPayloadLength,
-        radio.RegRxMaxPayloadLength
+        lora.RegPayloadLength,
+        lora.RegRxMaxPayloadLength
     );
 
-    radio.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
+    lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
     printLoraIrqs_(false);
 
-    radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
-    if (radio.RegHopPeriod != 0) {
-        printf("\r\nHopPeriod:0x%02x\r\n", radio.RegHopPeriod);
+    lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
+    if (lora.RegHopPeriod != 0) {
+        printf("\r\nHopPeriod:0x%02x\r\n", lora.RegHopPeriod);
     }
 
     printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff);
 
-    radio.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
-    printf("PreambleLength:0x%03x ", radio.RegPreamble);
+    lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
+    printf("PreambleLength:0x%03x ", lora.RegPreamble);
     
 
     if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) {
@@ -550,22 +559,22 @@
     printf("\r\n");
     printAgcAutoOn();
     if (radio.type == SX1272) {
-        printf(" LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize);
+        printf(" LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
     }
 
     printf("\r\nHeaderCount:%d PacketCount:%d, ",
         radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB));
 
     printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD));
-    radio.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
-    printf("detect_trig_same_peaks_nb:%d\r\n", radio.RegTest31.bits.detect_trig_same_peaks_nb);
+    lora.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
+    printf("detect_trig_same_peaks_nb:%d\r\n", lora.RegTest31.bits.detect_trig_same_peaks_nb);
 
     if (radio.type == SX1272) {
-        radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
-        printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize);
+        lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
+        printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
     } else if (radio.type == SX1276) {
-        radio.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
-        printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig3.sx1276bits.LowDataRateOptimize);        
+        lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
+        printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize);        
     }
     
     printf("\r\n");
@@ -573,7 +582,7 @@
 }
 #endif /* _DEBUG_ */
 
-void
+/*void
 service_radio()
 {
     service_action_e act = radio.service();
@@ -591,7 +600,7 @@
             printf("error\r\n");
             break;
     } // ...switch (act)
-}
+}*/
         
 int
 main(void)
@@ -636,23 +645,23 @@
                 }
             } else if (c == 'T') {
                 printf("start_tx\r\n");
-                radio.RegPayloadLength = 8;
-                radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength);
-                radio.lora_start_tx(8);
-            } else if (c == 'e') {
+                lora.RegPayloadLength = 8;
+                radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
+                lora.start_tx(8);
+            } /*else if (c == 'e') {
                 printf("service_radio\r\n");
                 service_radio();
-            } else if (c == 's') {
+            }*/ else if (c == 's') {
                 radio.set_opmode(RF_OPMODE_STANDBY);
                 printf("standby\r\n");
             } else if (c == 'h') {
                 printf("hwreset\r\n");
                 radio.hw_reset();
                 radio.init();   //SX1272Init( );
-            } else if (c == 'l') {
+            } /*else if (c == 'l') {
                 radio.SetLoRaOn(!radio.RegOpMode.bits.LongRangeMode);
                 printf("LongRangeMode:%d\r\n", radio.RegOpMode.bits.LongRangeMode);
-            } else if (c == '?') {
+            }*/ else if (c == '?') {
                 printf("s   standby\r\n");
                 printf("T   lora_start_tx(8)\r\n");
                 printf(".   print status\r\n");