From 2924f4f38d18bd491f396e14e8f73f22fa3d394d Mon Sep 17 00:00:00 2001 From: John Klug Date: Thu, 24 Sep 2020 17:23:46 -0500 Subject: Fix has-radio for MTCDTIP2, new EEPROM version 1 --- io-module/mts-io.c | 74 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 19 deletions(-) diff --git a/io-module/mts-io.c b/io-module/mts-io.c index 0477f2e..c595973 100644 --- a/io-module/mts-io.c +++ b/io-module/mts-io.c @@ -136,26 +136,36 @@ static time_t time_now_secs(void); bool sent_extra_long = false; /* - * This function takes the product_id and tries to check - * for a modem. If there is an error, assume there is a - * modem. Saying there is a modem when there is not + * For EEPROM layout after version 0, we use the + * CAPA_CELLULAR flag to determine if we have a cellular + * modem and this code is not used. + * + * Version 0 uses the product-id to determine if there is + * a modem or not. + * + * Saying there is a modem when there is not * just results in a slower boot. * If no hyphen in product ID, or no product ID, * assume we have a radio. - * If there is a hyphen test the character after the + * If there is a hyphen, test the character after the * first hyphen: * If the character is numeric, we have no modem. - * if the chracter is not a B, we have a modem. + * if the chracter is not a B or an I, we have a modem. * If the character is a B, and it is followed * by a numeric, we have no modem. - * If the B is the last character or is followed - * by a numeric, we have no modem. + * If the B is the last character we have a modem. + * If the modem field starts with IN, we have an + * India LoRa channel plan with no cellular modem. * All other cases, we have a modem. + * + * TRUE: 1 for return result + * FALSE: 0 for return result */ int mts_has_radio(const char *product_id, size_t len) { char *p; + int found_i = 0; if (!product_id || ! *product_id) return 1; /* No Product ID? */ p = memchr(product_id,'-',len); @@ -170,16 +180,30 @@ mts_has_radio(const char *product_id, size_t len) log_debug("Found digit after hypen"); return 0; /* Modem name never starts with a digit */ } - if (*p != 'B') { - log_debug("Found neither B nor digit after hypen"); - return 1; /* Modem starting with a letter, but not B */ + + /* For eeprom version 0, if the 2nd field starts with a B[n] + * it is a build #, and does not have a modem. If the 2nd field + * starts with an IN8, it is an Indian LoRa channel plan, + * and does not have a modem. */ + if (*p == 'I') + found_i = 1; + if ((*p != 'B') && (! found_i)) { + log_debug("Did not find B, I, or digit after hyphen in product-id"); + return 1; /* Modem starting with a letter, but not B or I */ } - /* Found a B */ + /* Found a B or an I */ p++; if (p >= product_id+len) { - log_debug("B at end of product-id string"); - return 1; /* Last character was B */ + log_debug("B or I at end of product-id string"); + return 1; /* Last character was B or I */ } + + /* No modem starts with IN */ + if (found_i && (*p == 'N')) { + log_debug("IN found in 2nd product-id field -- India LoRa Channel plan"); + return 0; + } + if (isdigit(*p)) { log_debug("B followed by digit after hyphen - no modem"); return 0; /* B[numeric] is MTR Build number */ @@ -515,8 +539,12 @@ static ssize_t mts_attr_show_product_info(struct device *dev, } else if (strcmp(attr->attr.name, "product-id") == 0) { value = sprintf(buf, "%.32s\n", id_eeprom.product_id); } else if (strcmp(attr->attr.name, "has-radio") == 0) { - value = sprintf(buf, "%1d\n", - mts_has_radio(id_eeprom.product_id,sizeof id_eeprom.product_id)); + if(id_eeprom.eeprom_layout_version == 0) + value = sprintf(buf, "%1lu\n", + mts_has_radio(id_eeprom.product_id,sizeof id_eeprom.product_id)); + else + /* Newer EEPROM version with CAPA_CELLULAR */ + value = sprintf(buf, "%1d\n",DEVICE_CAPA(id_eeprom.capa, CAPA_CELLULAR)); } else if (strcmp(attr->attr.name, "device-id") == 0) { value = sprintf(buf, "%.32s\n", id_eeprom.device_id); } else if (strcmp(attr->attr.name, "uuid") == 0) { @@ -636,7 +664,7 @@ mts_id_eeprom_load(void) int current_count; // Number of items in array struct attribute **all_attrs = NULL; char *tmp; - int noradio; + int noradio, has_cellular_capaflag = 0; int ret; const struct firmware* fw = NULL; @@ -658,8 +686,14 @@ mts_id_eeprom_load(void) // If we are an MTCPM, the base board sets the radio existance. if (strncmp(id_eeprom.hw_version,HW_VERSION_MTCPM_DASH,sizeof HW_VERSION_MTCPM_DASH) != 0) { - noradio = ! mts_has_radio(id_eeprom.product_id,sizeof id_eeprom.product_id); - log_debug("mts_id_eeprom: noradio=%d",noradio); + if (id_eeprom.eeprom_layout_version == 0) { + noradio = ! mts_has_radio(id_eeprom.product_id,sizeof id_eeprom.product_id); + log_debug("mts_id_eeprom_load: noradio=%d",noradio); + } else { + has_cellular_capaflag = 1; + noradio = ! DEVICE_CAPA(id_eeprom.capa, CAPA_CELLULAR); + log_debug("mts_id_eeprom_load: noradio=%d",noradio); + } } if (((tmp=HW_VERSION_MTCAP_0_0),strncmp(id_eeprom.hw_version, tmp, strlen(tmp)) == 0) || @@ -926,6 +960,7 @@ mts_id_eeprom_load(void) return -ENODEV; } + log_info("EEPROM-Layout-Version: %u",id_eeprom.eeprom_layout_version); log_info("sizeof: %lu", (unsigned long) sizeof(struct mts_id_eeprom_layout)); log_info("vendor-id: %.32s", id_eeprom.vendor_id); log_info("product-id: %.32s", id_eeprom.product_id); @@ -950,7 +985,8 @@ mts_id_eeprom_load(void) log_info("capa-lora: %s", DEVICE_CAPA(id_eeprom.capa, CAPA_LORA) ? "yes" : "no"); log_info("capa-battery: %s", DEVICE_CAPA(id_eeprom.capa, CAPA_BATTERY) ? "yes" : "no"); log_info("capa-supercap: %s", DEVICE_CAPA(id_eeprom.capa, CAPA_SUPERCAP) ? "yes" : "no"); - + if(has_cellular_capaflag) + log_info("capa-cellular: %s", DEVICE_CAPA(id_eeprom.capa, CAPA_CELLULAR) ? "yes" : "no"); if (DEVICE_CAPA(id_eeprom.capa, CAPA_BLUETOOTH)) { log_info("mac-bluetooth: %02X:%02X:%02X:%02X:%02X:%02X", -- cgit v1.2.3