summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io-module/mtcap.c13
-rw-r--r--io-module/mtcdt.c25
-rw-r--r--io-module/mts_io.c73
-rw-r--r--io-module/mts_io.h5
4 files changed, 108 insertions, 8 deletions
diff --git a/io-module/mtcap.c b/io-module/mtcap.c
index 804b364..b28e8eb 100644
--- a/io-module/mtcap.c
+++ b/io-module/mtcap.c
@@ -505,3 +505,16 @@ static struct attribute *mtcap_0_0_lora_attributes[] = {
static struct attribute_group mtcap_0_0_lora_attribute_group = {
.attrs = mtcap_0_0_lora_attributes
};
+
+// Reset for LoRa firmware is done using the I2C bus
+// on the MTCDTIPHP LoRa board.
+static struct attribute *mtcdtiphp_0_0_lora_attributes[] = {
+ &dev_attr_lora_eui_mtcap.attr,
+ &dev_attr_lora_product_id_mtcap.attr,
+ &dev_attr_lora_hw_version_mtcap.attr,
+ NULL,
+};
+
+static struct attribute_group mtcdtiphp_0_0_lora_attribute_group = {
+ .attrs = mtcdtiphp_0_0_lora_attributes
+};
diff --git a/io-module/mtcdt.c b/io-module/mtcdt.c
index 048e11c..b84e67a 100644
--- a/io-module/mtcdt.c
+++ b/io-module/mtcdt.c
@@ -714,12 +714,6 @@ static struct attribute *mtcdt_0_1_platform_attributes[] = {
&dev_attr_reset.attr,
&dev_attr_reset_monitor.attr,
&dev_attr_reset_monitor_intervals.attr,
- &dev_attr_radio_power.attr,
- &dev_attr_radio_reset.attr,
-
- &dev_attr_radio_reset_backoffs.attr,
- &dev_attr_radio_reset_backoff_index.attr,
- &dev_attr_radio_reset_backoff_seconds.attr,
&dev_attr_led_status.attr,
&dev_attr_led_cd_gpio.attr,
@@ -734,6 +728,18 @@ static struct attribute *mtcdt_0_1_platform_attributes[] = {
&dev_attr_usbhub_reset.attr,
&dev_attr_eth_reset.attr,
+
+ // radio feature is last to be able to
+ // easily remove radio.
+ // is_radio_power_attr_mtcdt() truncates
+ // this list.
+ &dev_attr_radio_power.attr,
+ &dev_attr_radio_reset.attr,
+
+ &dev_attr_radio_reset_backoffs.attr,
+ &dev_attr_radio_reset_backoff_index.attr,
+ &dev_attr_radio_reset_backoff_seconds.attr,
+
NULL,
};
@@ -757,3 +763,10 @@ static struct attribute_group mtcdt_platform_attribute_group = {
static struct attribute_group mtcdt_0_1_platform_attribute_group = {
.attrs = mtcdt_0_1_platform_attributes
};
+
+
+static int
+is_radio_power_attr_mtcdt(struct attribute *attr)
+{
+ return (attr == &dev_attr_radio_power.attr);
+} \ No newline at end of file
diff --git a/io-module/mts_io.c b/io-module/mts_io.c
index ebb1b22..d2e36c3 100644
--- a/io-module/mts_io.c
+++ b/io-module/mts_io.c
@@ -47,7 +47,7 @@
#include "mts_io.h"
-#define DRIVER_VERSION "v1.5.16"
+#define DRIVER_VERSION "v1.6.0"
#define DRIVER_AUTHOR "James Maki <jmaki@multitech.com>"
#define DRIVER_DESC "MTS-IO Controller"
#define DRIVER_NAME "mts-io"
@@ -883,6 +883,7 @@ mts_id_eeprom_load(void)
log_info("detected board %s", HW_VERSION_MTRV1_0_1);
} else if (((tmp=HW_VERSION_MTCDT_0_1),strncmp(id_eeprom.hw_version, tmp, strlen(tmp)) == 0) ||
((tmp=HW_VERSION_MTCDTIP_0_0),strncmp(id_eeprom.hw_version, tmp, strlen(tmp)) == 0)) {
+ int j=0;
attr_blength = sizeof mtcdt_0_1_platform_attributes;
if(DEVICE_CAPA(id_eeprom.capa, CAPA_WIFI)) {
attr_blength += sizeof mtcdt_0_1_wifi_bt_attributes;
@@ -907,10 +908,80 @@ mts_id_eeprom_load(void)
all_attrs[current_count] = (struct attribute *)NULL;
mtcdt_0_1_platform_attribute_group.attrs = all_attrs;
}
+
+ if((strncmp(id_eeprom.product_id, PRODUCT_ID_MTCDT, sizeof PRODUCT_ID_MTCDT - 1) == 0) &&
+ (id_eeprom.product_id[sizeof PRODUCT_ID_MTCDT] == '-') &&
+ isdigit(id_eeprom.product_id[sizeof PRODUCT_ID_MTCDT])) {
+ struct attribute **ap = mtcdt_0_1_platform_attribute_group.attrs;
+ while(1) {
+ if(ap[j] == NULL) {
+ log_info("Did not find radio power attribute. Possible driver fault.");
+ break;
+ }
+ j++;
+ if (is_radio_power_attr_mtcdt(ap[j])) {
+ log_info("Pruning radio feature from mts-io",j);
+ ap[j] = NULL;
+ break;
+ }
+ }
+ }
+
attr_group = &mtcdt_0_1_platform_attribute_group;
gpio_pins = gpio_pins_mtcdt_0_1;
log_info("detected board %s", tmp);
+ } else if ((tmp=HW_VERSION_MTCDTIPHP_0_0),strncmp(id_eeprom.hw_version, tmp, strlen(tmp)) == 0) {
+ attr_blength = sizeof mtcdt_0_1_platform_attributes;
+ if(DEVICE_CAPA(id_eeprom.capa, CAPA_WIFI)) {
+ attr_blength += sizeof mtcdt_0_1_wifi_bt_attributes;
+ }
+ if(DEVICE_CAPA(id_eeprom.capa, CAPA_GPS)) {
+ attr_blength += sizeof mtcdt_0_1_gnss_attributes;
+ }
+ if (attr_blength != sizeof mtcdt_0_1_platform_attributes) {
+ freelater = all_attrs = kmalloc(attr_blength,GFP_KERNEL);
+ current_blength = sizeof mtcdt_0_1_platform_attributes - sizeof (struct attribute *);
+ current_count = current_blength/(sizeof (struct attribute *));
+ memcpy(all_attrs,mtcdt_0_1_platform_attributes,current_blength);
+ if(DEVICE_CAPA(id_eeprom.capa, CAPA_WIFI)) {
+ memcpy(all_attrs + current_count,mtcdt_0_1_wifi_bt_attributes,sizeof mtcdt_0_1_wifi_bt_attributes);
+ current_count += sizeof mtcdt_0_1_wifi_bt_attributes / (sizeof (struct attribute *));
+ }
+ if(DEVICE_CAPA(id_eeprom.capa, CAPA_GPS)) {
+ attr_blength += sizeof mtcdt_0_1_gnss_attributes;
+ memcpy(all_attrs + current_count,mtcdt_0_1_gnss_attributes,sizeof mtcdt_0_1_gnss_attributes);
+ current_count += sizeof mtcdt_0_1_gnss_attributes / (sizeof (struct attribute *));
+ }
+ all_attrs[current_count] = (struct attribute *)NULL;
+ mtcdt_0_1_platform_attribute_group.attrs = all_attrs;
+ }
+
+ int j=0;
+ /* See if we have no radio, and if so, prune out the stuff that follows */
+ if((strncmp(id_eeprom.product_id, PRODUCT_ID_MTCDTIPHP, sizeof PRODUCT_ID_MTCDTIPHP - 1) == 0) &&
+ (id_eeprom.product_id[sizeof PRODUCT_ID_MTCDTIPHP-1] == '-') &&
+ isdigit(id_eeprom.product_id[sizeof PRODUCT_ID_MTCDTIPHP])) {
+ struct attribute **ap = mtcdt_0_1_platform_attribute_group.attrs;
+ while(1) {
+ if(ap[j] == NULL) {
+ log_info("Did not find radio power attribute. Possible driver fault.");
+ break;
+ }
+ j++;
+ if (is_radio_power_attr_mtcdt(ap[j])) {
+ log_info("Pruning radio feature from mts-io",j);
+ ap[j] = NULL;
+ break;
+ }
+ }
+ }
+ attr_group = &mtcdt_0_1_platform_attribute_group;
+ gpio_pins = gpio_pins_mtcdt_0_1;
+ if (DEVICE_CAPA(id_eeprom.capa, CAPA_LORA)) {
+ attr_group_lora = &mtcdtiphp_0_0_lora_attribute_group;
+ }
+ log_info("detected board %s", tmp);
} else {
attr_group = &mtcdt_platform_attribute_group;
gpio_pins = gpio_pins_mtcdt_0_0;
diff --git a/io-module/mts_io.h b/io-module/mts_io.h
index 7c2a969..241ed1d 100644
--- a/io-module/mts_io.h
+++ b/io-module/mts_io.h
@@ -45,7 +45,8 @@ struct device_attribute _dev_name = { \
#define PRODUCT_ID_MTR "MTR"
#define PRODUCT_ID_MTCDT "MTCDT"
#define PRODUCT_ID_MTCAP "MTCAP"
-#define PRODCUT_ID_MTCDTIP "MTCDTIP"
+#define PRODUCT_ID_MTCDTIP "MTCDTIP"
+#define PRODUCT_ID_MTCDTIPHP "MTCDTIPHP"
#define PRODUCT_ID_MTAC_GPIOB "MTAC-GPIOB"
#define PRODUCT_ID_MTAC_MFSER "MTAC-MFSER"
@@ -72,6 +73,7 @@ struct device_attribute _dev_name = { \
#define HW_VERSION_MTCDT_0_0 "MTCDT-0.0"
#define HW_VERSION_MTCDT_0_1 "MTCDT-0.1"
#define HW_VERSION_MTCDTIP_0_0 "MTCDTIP-0.0"
+#define HW_VERSION_MTCDTIPHP_0_0 "MTCDTIPHP-0.0"
#define HW_VERSION_MTCAP_0_0 "MTCAP-0.0"
#define HW_VERSION_MTCAP_0_1 "MTCAP-0.1"
@@ -85,6 +87,7 @@ enum {
MTRV1_0_1,
MTCDT_0_0,
MTCDT_0_1,
+ MTCDTIPHP_0_0,
MTCAP_0_0,
MTCAP_0_1,
};