summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS10
-rw-r--r--io-module/buttons.c2
-rw-r--r--io-module/buttons.h3
-rw-r--r--io-module/gpio.c1
-rw-r--r--io-module/mtac.c258
-rw-r--r--io-module/mtac_eth.c139
-rw-r--r--io-module/mtac_gpiob.c598
-rw-r--r--io-module/mtac_lora.c233
-rw-r--r--io-module/mtac_mfser.c286
-rw-r--r--io-module/mtac_pulse.c199
-rw-r--r--io-module/mtcdt.c265
-rw-r--r--io-module/mths.c3
-rw-r--r--io-module/mtr.c6
-rw-r--r--io-module/mts-io.c679
-rw-r--r--io-module/mts_eeprom.h2
-rw-r--r--io-module/mts_io.h111
-rw-r--r--io-module/mts_io_module.h74
17 files changed, 582 insertions, 2287 deletions
diff --git a/NEWS b/NEWS
index e69de29..149c8a0 100644
--- a/NEWS
+++ b/NEWS
@@ -0,0 +1,10 @@
+Starting with mts-io 3, the following changes were made:
+
+When unloading the module, all gpio pins that were
+acquired are freed.
+
+All MTAC (Multitech Accessory Card) related code
+was removed from the mts-io module.
+
+See the mtac driver and the various accessory card
+drivers which all have their own repositories.
diff --git a/io-module/buttons.c b/io-module/buttons.c
index 045dd22..07ac635 100644
--- a/io-module/buttons.c
+++ b/io-module/buttons.c
@@ -69,7 +69,7 @@ ssize_t mts_attr_show_button_monitor_intervals(struct device *dev, struct device
return ret;
}
-ssize_t mts_attr_store_button_monitor_intervals(struct device *dev, struct device_attribute *attr, char *buf, size_t count)
+ssize_t mts_attr_store_button_monitor_intervals(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int short_int;
int long_int;
diff --git a/io-module/buttons.h b/io-module/buttons.h
index 9a09fac..8bbe58a 100644
--- a/io-module/buttons.h
+++ b/io-module/buttons.h
@@ -29,6 +29,7 @@
#include <linux/io.h>
#include <linux/module.h>
+#include "mts_io_module.h"
#include "mts_io.h"
#define BUTTON_CHECK_PER_SEC 8
@@ -64,7 +65,7 @@ extern void cleanup_buttons(void);
extern int set_buttons (button_info_pt* platform_buttons);
extern ssize_t mts_attr_show_button_monitor_intervals(struct device *dev, struct device_attribute *attr, char *buf);
-extern ssize_t mts_attr_store_button_monitor_intervals(struct device *dev, struct device_attribute *attr, char *buf, size_t count);
+extern ssize_t mts_attr_store_button_monitor_intervals(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
extern ssize_t mts_attr_show_button_monitor(struct device *dev,
struct device_attribute *attr,
char *buf);
diff --git a/io-module/gpio.c b/io-module/gpio.c
index a01e979..0b45300 100644
--- a/io-module/gpio.c
+++ b/io-module/gpio.c
@@ -1,3 +1,4 @@
+#include <linux/delay.h>
struct gpio_pin *gpio_pin_by_name(const char *name) {
struct gpio_pin *pin;
diff --git a/io-module/mtac.c b/io-module/mtac.c
deleted file mode 100644
index f0f1999..0000000
--- a/io-module/mtac.c
+++ /dev/null
@@ -1,258 +0,0 @@
-static struct kobj_attribute* create_attribute(const char* _name, umode_t _mode) {
- char* attr_name;
- struct kobj_attribute* _attr;
-
- _attr = kzalloc(sizeof(struct kobj_attribute), GFP_KERNEL);
- if (! _attr) {
- log_error("kzalloc of attribute [%s] failed", _name);
- return NULL;
- }
-
- sysfs_attr_init(_attr);
- attr_name = kstrdup(_name, GFP_KERNEL);
- if (! attr_name) {
- log_error("GFP_KERNEL dup failed for attribute [%s]", _name);
- return NULL;
- }
-
- _attr->attr.name = attr_name;
- _attr->attr.mode = _mode;
-
- return _attr;
-}
-
-static int port_from_kobject(struct kobject *kobj) {
- int port;
- const char *name;
-
- name = kobj->name;
- if (! name) {
- log_error("kobject->name is NULL");
- return -1;
- }
-
- if (sscanf(name, "ap%d", &port) < 1) {
- log_error("failed to scan port from kobject->name [%s]", name);
- return -1;
- }
-
- if (port < 1 || port > NUM_AP) {
- log_error("port number %d is invalid", port);
- return -1;
- }
-
- return port;
-}
-
-static ssize_t ap_show_product_info(struct kobject *kobj, struct kobj_attribute *attr, char *buf) {
- ssize_t value;
- int port;
- int port_index;
-
- port = port_from_kobject(kobj);
- if (port < 1) {
- log_error("port_from_kobject returned %d", port);
- return -1;
- }
- port_index = port - 1;
-
- if (! strcmp(attr->attr.name, "vendor-id")) {
- value = snprintf(buf, 32, "%s\n", ap_eeprom[port_index].vendor_id);
- } else if (! strcmp(attr->attr.name, "product-id")) {
- value = snprintf(buf, 32, "%s\n", ap_eeprom[port_index].product_id);
- } else if (! strcmp(attr->attr.name, "device-id")) {
- value = snprintf(buf, 32, "%s\n", ap_eeprom[port_index].device_id);
- } else if (! strcmp(attr->attr.name, "hw-version")) {
- value = snprintf(buf, 32, "%s\n", ap_eeprom[port_index].hw_version);
- } else if (! strcmp(attr->attr.name, "mac-addr")) {
- value = sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X\n",
- ap_eeprom[port_index].mac_addr[0],
- ap_eeprom[port_index].mac_addr[1],
- ap_eeprom[port_index].mac_addr[2],
- ap_eeprom[port_index].mac_addr[3],
- ap_eeprom[port_index].mac_addr[4],
- ap_eeprom[port_index].mac_addr[5]);
- } else if (! strcmp(attr->attr.name, "eui")) {
- value = sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
- ap_eeprom[port_index].eui[0],
- ap_eeprom[port_index].eui[1],
- ap_eeprom[port_index].eui[2],
- ap_eeprom[port_index].eui[3],
- ap_eeprom[port_index].eui[4],
- ap_eeprom[port_index].eui[5],
- ap_eeprom[port_index].eui[6],
- ap_eeprom[port_index].eui[7]);
- } else {
- log_error("attribute [%s] not found", attr->attr.name);
- value = -1;
- }
-
- return value;
-}
-
-static bool ap_add_product_info_attributes(int port, int type, struct attribute** attrs, int* index) {
- char buf[32];
- struct kobj_attribute* kobj_attr;
-
- switch (type) {
- case MTAC_ETH_0_0:
- sprintf(buf, "mac-addr");
- kobj_attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! kobj_attr) {
- log_error("failed to create attribute [%s] in port %d", buf, port);
- return false;
- }
- kobj_attr->show = ap_show_product_info;
- attrs[(*index)++] = &kobj_attr->attr;
- break;
-
- case MTAC_GPIOB_0_0:
- case MTAC_MFSER_0_0:
- case MTAC_PULSE_1_0:
- break;
-
- case MTAC_LORA_0_0:
- case MTAC_LORA_1_0:
- case MTAC_LORA_1_1:
- case MTAC_LORA_1_5:
- sprintf(buf, "eui");
- kobj_attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! kobj_attr) {
- log_error("failed to create attribute [%s] in port %d", buf, port);
- return false;
- }
- kobj_attr->show = ap_show_product_info;
- attrs[(*index)++] = &kobj_attr->attr;
- break;
-
- default:
- log_error("invalid accessory card type");
- return false;
- }
-
- sprintf(buf, "vendor-id");
- kobj_attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! kobj_attr) {
- log_error("failed to create attribute [%s] in port %d", buf, port);
- return false;
- }
- kobj_attr->show = ap_show_product_info;
- attrs[(*index)++] = &kobj_attr->attr;
-
- sprintf(buf, "product-id");
- kobj_attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! kobj_attr) {
- log_error("failed to create attribute [%s] in port %d", buf, port);
- return false;
- }
- kobj_attr->show = ap_show_product_info;
- attrs[(*index)++] = &kobj_attr->attr;
-
- sprintf(buf, "device-id");
- kobj_attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! kobj_attr) {
- log_error("failed to create attribute [%s] in port %d", buf, port);
- return false;
- }
- kobj_attr->show = ap_show_product_info;
- attrs[(*index)++] = &kobj_attr->attr;
-
- sprintf(buf, "hw-version");
- kobj_attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! kobj_attr) {
- log_error("failed to create attribute [%s] in port %d", buf, port);
- return false;
- }
- kobj_attr->show = ap_show_product_info;
- attrs[(*index)++] = &kobj_attr->attr;
-
- return true;
-}
-
-struct gpio_pin *ap_gpio_pin_by_attr_name(const char *name, int port) {
- struct gpio_pin *pin;
- char *pin_attr_name;
- int port_index = port - 1;
-
- pin_attr_name = port_info[port_index]->gpio_pin_name_by_attr_name(name, port);
-
- for (pin = gpio_pins; *pin->name; pin++) {
- if (!strcmp(pin->pin.label, pin_attr_name)) {
- return pin;
- }
- }
-
- log_error("pin with attr name [%s] not found", name);
- return NULL;
-}
-
-static ssize_t mts_attr_show_ap_gpio_pin(struct kobject *kobj,
- struct kobj_attribute *attr,
- char *buf)
-{
- int value;
- int port;
- struct gpio_pin *pin;
-
- port = port_from_kobject(kobj);
- if (port < 1) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
-
- pin = ap_gpio_pin_by_attr_name(attr->attr.name, port);
- if (!pin) {
- return -ENODEV;
- }
-
- mutex_lock(&mts_io_mutex);
-
- value = gpio_get_value(pin->pin.gpio);
-
- mutex_unlock(&mts_io_mutex);
-
- if (value < 0) {
- return value;
- }
-
- if (pin->active_low) {
- value = !value;
- }
-
- return sprintf(buf, "%d\n", value);
-}
-
-static ssize_t mts_attr_store_ap_gpio_pin(struct kobject *kobj,
- struct kobj_attribute *attr, const char *buf, size_t count)
-{
- int value;
- int port;
- struct gpio_pin *pin;
-
- port = port_from_kobject(kobj);
- if (port < 1) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
-
- pin = ap_gpio_pin_by_attr_name(attr->attr.name, port);
- if (!pin) {
- return -ENODEV;
- }
-
- if (sscanf(buf, "%i", &value) != 1) {
- return -EINVAL;
- }
-
- if (pin->active_low) {
- value = !value;
- }
-
- mutex_lock(&mts_io_mutex);
-
- gpio_set_value(pin->pin.gpio, value);
-
- mutex_unlock(&mts_io_mutex);
-
- return count;
-}
diff --git a/io-module/mtac_eth.c b/io-module/mtac_eth.c
deleted file mode 100644
index 99e8c1d..0000000
--- a/io-module/mtac_eth.c
+++ /dev/null
@@ -1,139 +0,0 @@
-static char* eth_gpio_pin_name_by_attr_name(const char* name, int port) {
- switch (port) {
- case port_1:
- if (! strcmp(name, "reset")) {
- return "ap1-reset";
- } else {
- log_error("attribute name [%s] is invalid for ETH in port %d", name, port);
- return "";
- }
-
- case port_2:
- if (! strcmp(name, "reset")) {
- return "ap2-reset";
- } else {
- log_error("attribute name [%s] is invalid for ETH in port %d", name, port);
- return "";
- }
- }
-}
-
-// 1 vendor-id
-// 1 product-id
-// 1 device-id
-// 1 hw-version
-// 1 mac-addr or eui
-// 1 reset
-// NULL
-static size_t ap_eth_attrs_size = 7;
-
-static bool eth_setup(enum ap port) {
- int i;
- int port_index = port - 1;
- int index = 0;
- int count = 0;
- int ret;
- char buf[32];
- struct attribute **attrs;
- struct kobj_attribute* attr;
-
- log_info("loading ETH accessory card in port %d", port);
-
- sprintf(buf, "ap%d", port);
- ap_subdirs[port_index] = kobject_create_and_add(buf, &mts_io_platform_device->dev.kobj);
- if (! ap_subdirs[port_index]) {
- log_error("kobject_create_and_add for ETH in port %d failed", port);
- return false;
- }
-
- // create the link to the apX directory this card is in
- // if we're in the first slot, we get plain "eth"
- // if we're in a different slot, we might need to use "eth-2" to differentiate
- if (port > 1) {
- for (i = 1; i < port; i++) {
- if (port_info[i - 1]) {
- if (strstr(port_info[i - 1]->product_id, PRODUCT_ID_MTAC_ETH)) {
- count++;
- }
- }
- }
- }
- if (count > 0) {
- sprintf(buf, "eth-%d", count + 1);
- } else {
- sprintf(buf, "eth");
- }
- ret = sysfs_create_link(ap_subdirs[port_index]->parent, ap_subdirs[port_index], buf);
- if (ret) {
- log_error("failed to link [%s] to [%s], %d", buf, ap_subdirs[port_index]->name, ret);
- }
-
- attrs = kzalloc(sizeof(struct attribute*) * ap_eth_attrs_size, GFP_KERNEL);
- if (! attrs) {
- log_error("failed to allocate attribute space for port %d", port);
- return false;
- }
-
- sprintf(buf, "reset");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for ETH in port %d", buf, port);
- kfree(attrs);
- return false;
- }
- ap_attr_groups[port_index].attrs = attrs;
-
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- // add attributes for eeprom contents
- if (! ap_add_product_info_attributes(port, MTAC_ETH_0_0, attrs, &index)) {
- log_error("failed to add product info attributes for ETH in port %d", port);
- return false;
- }
- attrs[index] = NULL;
-
- if (sysfs_create_group(ap_subdirs[port_index], &ap_attr_groups[port_index])) {
- log_error("sysfs_create_group failed for ETH in port %d", port);
- return false;
- }
-
- return true;
-}
-
-static bool eth_teardown(enum ap port) {
- int i;
- int port_index = port - 1;
- struct attribute **attrs = ap_attr_groups[port_index].attrs;
-
- log_info("unloading ETH accessory card in port %d", port);
-
- // clean up allocated memory for attributes
- for (i = 0; i < ap_eth_attrs_size; i++) {
- if (attrs[i]) {
- if (attrs[i]->name)
- kfree(attrs[i]->name);
-
- kfree(attrs[i]);
- }
- }
-
- kfree(attrs);
-
- // clean up our "apX/" kobject if it exists
- if (ap_subdirs[port_index]) {
- kobject_put(ap_subdirs[port_index]);
- }
-
- return true;
-}
-
-bool set_eth_info(struct ap_info* info) {
- snprintf(info->product_id, 32, "%s", PRODUCT_ID_MTAC_ETH);
- info->setup = &eth_setup;
- info->teardown = &eth_teardown;
- info->gpio_pin_name_by_attr_name = &eth_gpio_pin_name_by_attr_name;
-
- return true;
-}
diff --git a/io-module/mtac_gpiob.c b/io-module/mtac_gpiob.c
deleted file mode 100644
index 3dbd828..0000000
--- a/io-module/mtac_gpiob.c
+++ /dev/null
@@ -1,598 +0,0 @@
-struct spi_device *gpiob_spi[NUM_AP][3];
-struct spi_driver gpiob_spi_drivers[NUM_AP][3];
-
-static u8 spi_ap_dout_value[NUM_AP];
-static DEFINE_MUTEX(spi_ap_dout_mutex);
-static unsigned int ap_dout_max_speed_hz = 1 * 1000 * 1000;
-module_param(ap_dout_max_speed_hz, uint, S_IRUGO);
-MODULE_PARM_DESC(
- ap_dout_max_speed_hz,
- "Maximum clock rate to be used with this device (default: 1 MHz)"
-);
-
-static unsigned int ap_din_max_speed_hz = 1 * 1000 * 1000;
-module_param(ap_din_max_speed_hz, uint, S_IRUGO);
-MODULE_PARM_DESC(
- ap_din_max_speed_hz,
- "Maximum clock rate to be used with this device (default: 1 MHz)"
-);
-
-static unsigned int ap_adc_max_speed_hz = 20 * 1000 * 1000;
-module_param(ap_adc_max_speed_hz, uint, S_IRUGO);
-MODULE_PARM_DESC(
- ap_adc_max_speed_hz,
- "Maximum clock rate to be used with this device (default: 20 MHz)"
-);
-
-static bool gpiob_get_dev_info_from_modalias(const char* modalias, int* port, char* buf) {
- sscanf(modalias, "mts-io-ap%d-%s", port, buf);
-
- return true;
-}
-
-/* Generic SPI functions */
-static inline int spi_writen(struct spi_device *spi, const u8 *buf, size_t len)
-{
- int tmp;
- u8 *tx;
-
- tx = kmalloc(len, GFP_KERNEL);
- if (!tx) {
- return -ENOMEM;
- }
-
- memcpy(tx, buf, len);
- tmp = spi_write(spi, tx, len);
-
- kfree(tx);
-
- return tmp;
-}
-
-static inline int spi_readn(struct spi_device *spi, u8 *buf, size_t len)
-{
- int tmp;
- u8 *rx;
-
- rx = kmalloc(len, GFP_KERNEL);
- if (!rx) {
- return -ENOMEM;
- }
-
- tmp = spi_read(spi, rx, len);
- memcpy(buf, rx, len);
-
- kfree(rx);
-
- return tmp;
-}
-
-static int mts_spi_ap_probe(struct spi_device *spi)
-{
- int tmp;
- int port;
- int port_index;
- char buf[16];
- enum spi_devices dev;
-
- gpiob_get_dev_info_from_modalias(spi->modalias, &port, buf);
- port_index = port - 1;
- if (port < 1 || port > NUM_AP) {
- log_error("port %d is invalid", port);
- return -ENODEV;
- }
-
- if (strstr(buf, "dout")) {
- dev = dout;
- spi->max_speed_hz = ap_dout_max_speed_hz;
- spi->mode = 0;
- } else if (strstr(buf, "din")) {
- dev = din;
- spi->max_speed_hz = ap_din_max_speed_hz;
- spi->mode = SPI_CPOL;
- } else if (strstr(buf, "adc")) {
- dev = adc;
- spi->max_speed_hz = ap_adc_max_speed_hz;
- spi->mode = 0;
- } else {
- log_error("unknown gpiob spi device type [%s]", buf);
- return -ENODEV;
- }
-
- gpiob_spi[port_index][dev] = spi;
-
- tmp = spi_setup(gpiob_spi[port_index][dev]);
- if (tmp < 0) {
- log_error("spi_setup ap %d [%s] failed", port, buf);
- return tmp;
- }
-
- if (dev == dout) {
- spi_ap_dout_value[port_index] = 0x00;
- spi_writen(gpiob_spi[port_index][dev], &spi_ap_dout_value[port_index], 1);
- }
-
- return 0;
-}
-
-static int mts_spi_ap_remove(struct spi_device *spi)
-{
- int port;
- int port_index;
- char buf[16];
-
- gpiob_get_dev_info_from_modalias(spi->modalias, &port, buf);
- port_index = port - 1;
- if (port < 1 || port > NUM_AP) {
- log_error("port %d is invalid", port);
- return -ENODEV;
- }
-
- if (strstr(buf, "dout")) {
- gpiob_spi[port_index][dout] = NULL;
- } else if (strstr(buf, "din")) {
- gpiob_spi[port_index][din] = NULL;
- } else if (strstr(buf, "adc")) {
- gpiob_spi[port_index][adc] = NULL;
- } else {
- log_error("unknown gpiob spi device type [%s]", buf);
- return -ENODEV;
- }
-
- return 0;
-}
-
-static char* gpiob_gpio_pin_name_by_attr_name(const char* name, int port) {
- switch (port) {
- case port_1:
- if (! strcmp(name, "led1")) {
- return "ap1-gpio3";
- } else if (! strcmp(name, "led2")) {
- return "ap1-gpio4";
- } else if (! strcmp(name, "dout-enable")) {
- return "ap1-gpio1";
- } else if (! strcmp(name, "reset")) {
- return "ap1-reset";
- } else {
- log_error("attribute name [%s] is invalid for GPIOB in port %d", name, port);
- return "";
- }
-
- case port_2:
- if (! strcmp(name, "led1")) {
- return "ap2-gpio3";
- } else if (! strcmp(name, "led2")) {
- return "ap2-gpio4";
- } else if (! strcmp(name, "dout-enable")) {
- return "ap2-gpio1";
- } else if (! strcmp(name, "reset")) {
- return "ap2-reset";
- } else {
- log_error("attribute name [%s] is invalid for GPIOB in port %d", name, port);
- return "";
- }
- }
- log_error("gpiob: Invalid port number");
- return "";
-}
-
-static ssize_t mts_attr_show_ap_din(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
-{
- int tmp;
- int channel;
- int port;
- int port_index;
- u8 bit;
- u8 byte;
-
- sscanf(attr->attr.name, "din%d", &channel);
- if (channel < 0 || channel > 3) {
- log_error("channel %d is invalid", channel);
- return -ENOENT;
- }
-
- port = port_from_kobject(kobj);
- if (port < 0) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
- port_index = port - 1;
-
- bit = BIT(channel);
-
- tmp = spi_readn(gpiob_spi[port_index][din], &byte, 1);
- if (tmp) {
- log_error("spi_read failed %d", tmp);
- return tmp;
- }
-
- tmp = byte & bit ? 1 : 0;
-
- return sprintf(buf, "%d\n", tmp);
-}
-
-static ssize_t mts_attr_store_ap_dout(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
-{
- int value;
- int channel;
- int port;
- int port_index;
- u8 bit;
-
- sscanf(attr->attr.name, "dout%d", &channel);
- if (channel < 0 || channel > 3) {
- log_error("channel %d is invalid", channel);
- return -ENOENT;
- }
-
- port = port_from_kobject(kobj);
- if (port < 0) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
- port_index = port - 1;
-
- bit = BIT(channel);
-
- if (sscanf(buf, "%i", &value) != 1) {
- log_error("accessory card dout attr invalid argument %d", value);
- return -EINVAL;
- }
-
- mutex_lock(&spi_ap_dout_mutex);
-
- if (value) {
- spi_ap_dout_value[port_index] &= ~bit;
- } else {
- spi_ap_dout_value[port_index] |= bit;
- }
-
- spi_writen(gpiob_spi[port_index][dout], &spi_ap_dout_value[port_index], 1);
-
- mutex_unlock(&spi_ap_dout_mutex);
-
- return count;
-}
-
-static ssize_t mts_attr_show_ap_dout(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
-{
- int value;
- int channel;
- int port;
- int port_index;
- u8 bit;
-
- sscanf(attr->attr.name, "dout%d", &channel);
- if (channel < 0 || channel > 3) {
- log_error("channel %d is invalid", channel);
- return -ENOENT;
- }
-
- port = port_from_kobject(kobj);
- if (port < 0) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
- port_index = port - 1;
-
- bit = BIT(channel);
-
- mutex_lock(&spi_ap_dout_mutex);
-
- value = spi_ap_dout_value[port_index] & bit ? 0 : 1;
-
- mutex_unlock(&spi_ap_dout_mutex);
-
- return sprintf(buf, "%d\n", value);
-}
-
-static ssize_t mts_attr_show_ap_adc(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
-{
- int tmp;
- int tx_data;
- int rx_data;
- int channel;
- int port;
- int port_index;
- int channel_mask = 0x0180; /* 0b 0000 0001 1000 0000 */
- int manual_mode = 0x1840; /* 0b 0001 1000 0100 0000 */
- uint8_t tx[2];
- uint8_t rx[2];
-
- memset(tx, 0, sizeof(tx));
- memset(rx, 0, sizeof(rx));
-
- sscanf(attr->attr.name, "adc%d", &channel);
- if (channel < 0 || channel > 2) {
- log_error("channel %d is invalid", channel);
- return -ENOENT;
- }
-
- port = port_from_kobject(kobj);
- if (port < 0) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
- port_index = port - 1;
-
- /* 1st transfer to set up (5V reference, channel to read from) */
- tx_data = manual_mode | ((channel << 7) & channel_mask);
- tx[0] = tx_data >> 8;
- tx[1] = tx_data & 0xFF;
- tmp = spi_writen(gpiob_spi[port_index][adc], tx, 2);
- if (tmp) {
- log_error("spi_write failed %d", tmp);
- return tmp;
- }
-
- /* 2nd transfer to clock chip for ADC conversion
- * this can be a throw-away read or an empty write,
- * the ADC just needs the clock running so it can convert */
- tx[0] = 0;
- tx[1] = 0;
- tmp = spi_writen(gpiob_spi[port_index][adc], tx, 2);
- if (tmp) {
- log_error("2nd spi_write failed %d", tmp);
- return tmp;
- }
-
- /* 3rd transfer to read data */
- tmp = spi_readn(gpiob_spi[port_index][adc], rx, 2);
- if (tmp) {
- log_error("spi_read failed %d", tmp);
- return tmp;
- }
- rx_data = ((rx[0] & 0x0F) << 8) | (rx[1] & 0xFF);
-
- return sprintf(buf, "%lu\n", (unsigned long) rx_data);
-}
-
-static bool gpiob_spi_driver_setup(struct spi_driver *driver, const char *driver_name) {
- char* name = kstrdup(driver_name, GFP_KERNEL);
- if (! name) {
- log_error("GFP_KERNEL dup failed for driver [%s]", driver_name);
- return false;
- }
- driver->driver.name = name;
- driver->driver.bus = &spi_bus_type;
- driver->driver.owner = THIS_MODULE;
- driver->probe = mts_spi_ap_probe;
- driver->remove = mts_spi_ap_remove;
-
- return true;
-}
-
-// 4 digital inputs
-// 4 digital outputs
-// 3 analog to digital
-// 2 LEDs
-// 1 digital out enable
-// 1 reset
-// 1 vendor-id
-// 1 product-id
-// 1 device-id
-// 1 hw-version
-// NULL
-static int ap_gpiob_attrs_size = 20;
-
-static bool gpiob_setup(enum ap port) {
- int i;
- int port_index = port - 1;
- int index = 0;
- int count = 0;
- int ret;
- char buf[32];
- struct kobj_attribute* attr;
- struct attribute **attrs;
-
- log_info("loading GPIOB accessory card in port %d", port);
-
- sprintf(buf, "ap%d", port);
- ap_subdirs[port_index] = kobject_create_and_add(buf, &mts_io_platform_device->dev.kobj);
- if (! ap_subdirs[port_index]) {
- log_error("kobject_create_and_add for port %d failed", port);
- return false;
- }
-
- // create the link to the apX directory this card is in
- // if we're in the first slot, we get plain "gpiob"
- // if we're in a different slot, we might need to use "gpiob-2" to differentiate
- if (port > 1) {
- for (i = 1; i < port; i++) {
- if (port_info[i - 1]) {
- if (strstr(port_info[i - 1]->product_id, PRODUCT_ID_MTAC_GPIOB)) {
- count++;
- }
- }
- }
- }
- if (count > 0) {
- sprintf(buf, "gpiob-%d", count + 1);
- } else {
- sprintf(buf, "gpiob");
- }
- ret = sysfs_create_link(ap_subdirs[port_index]->parent, ap_subdirs[port_index], buf);
- if (ret) {
- log_error("failed to link [%s] to [%s], %d", buf, ap_subdirs[port_index]->name, ret);
- }
-
- attrs = kzalloc(sizeof(struct attribute*) * ap_gpiob_attrs_size, GFP_KERNEL);
- if (! attrs) {
- log_error("failed to allocate attribute space for port %d", port);
- return false;
- }
-
- // add digital inputs
- for (i = 0; i < 4; i++) {
- sprintf(buf, "din%d", i);
- attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! attr) {
- log_error("failed to create attribute [%s]", buf);
- return false;
- }
- attr->show = mts_attr_show_ap_din;
- attrs[index++] = &attr->attr;
- }
-
- // add digital outputs
- for (i = 0; i < 4; i++) {
- sprintf(buf, "dout%d", i);
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_dout;
- attr->store = mts_attr_store_ap_dout;
- attrs[index++] = &attr->attr;
- }
-
- // add analog to digital
- for (i = 0; i < 3; i++) {
- sprintf(buf, "adc%d", i);
- attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! attr) {
- log_error("failed to create attribute [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_adc;
- attrs[index++] = &attr->attr;
- }
-
- // add LEDs
- for (i = 1; i <= 2; i++) {
- sprintf(buf, "led%d", i);
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
- }
-
- // add misc attributes
- sprintf(buf, "dout-enable");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- sprintf(buf, "reset");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- // add attributes for eeprom contents
- if (! ap_add_product_info_attributes(port, MTAC_GPIOB_0_0, attrs, &index)) {
- log_error("failed to add product info attributes for GPIOB in port %d", port);
- return false;
- }
-
- attrs[index] = NULL;
-
- ap_attr_groups[port_index].attrs = attrs;
-
- // setup and register drivers
- log_debug("registering accessory card %d dout driver", port);
- sprintf(buf, "mts-io-ap%d-dout", port);
- if (! gpiob_spi_driver_setup(&gpiob_spi_drivers[port_index][dout], buf)) {
- log_error("failed to set up spi driver [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- if (spi_register_driver(&gpiob_spi_drivers[port_index][dout])) {
- log_error("failed to register accessory card %d dout driver", port);
- spi_unregister_driver(&gpiob_spi_drivers[port_index][dout]);
- return false;
- }
-
- log_debug("registering accessory card %d din driver", port);
- sprintf(buf, "mts-io-ap%d-din", port);
- if (! gpiob_spi_driver_setup(&gpiob_spi_drivers[port_index][din], buf)) {
- log_error("failed to set up spi driver [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- if (spi_register_driver(&gpiob_spi_drivers[port_index][din])) {
- log_error("failed to register accessory card %d din driver", port);
- spi_unregister_driver(&gpiob_spi_drivers[port_index][din]);
- return false;
- }
-
- log_debug("registering accessory card %d adc driver", port);
- sprintf(buf, "mts-io-ap%d-adc", port);
- if (! gpiob_spi_driver_setup(&gpiob_spi_drivers[port_index][adc], buf)) {
- log_error("failed to set up spi driver [%s] for GPIOB in port %d", buf, port);
- return false;
- }
- if (spi_register_driver(&gpiob_spi_drivers[port_index][adc])) {
- log_error("failed to register accessory card %d adc driver", port);
- spi_unregister_driver(&gpiob_spi_drivers[port_index][adc]);
- return false;
- }
-
- if (sysfs_create_group(ap_subdirs[port_index], &ap_attr_groups[port_index])) {
- log_error("sysfs_create_group failed for GPIOB in port %d", port);
- return false;
- }
-
- return true;
-}
-
-static bool gpiob_teardown(enum ap port) {
- int i;
- int port_index = port - 1;
- struct attribute **attrs = ap_attr_groups[port_index].attrs;
-
- log_info("unloading GPIOB accessory card in port %d", port);
-
- // clean up allocated memory for attributes
- for (i = 0; i < ap_gpiob_attrs_size; i++) {
- if (attrs[i]) {
- if (attrs[i]->name)
- kfree(attrs[i]->name);
-
- kfree(attrs[i]);
- }
- }
-
- kfree(attrs);
-
- // clean up our "apX/" kobject if it exists
- if (ap_subdirs[port_index]) {
- kobject_put(ap_subdirs[port_index]);
- }
-
- // clean up allocated memory for SPI drivers
- if (gpiob_spi_drivers[port_index][dout].driver.name)
- kfree(gpiob_spi_drivers[port_index][dout].driver.name);
- if (gpiob_spi_drivers[port_index][din].driver.name)
- kfree(gpiob_spi_drivers[port_index][din].driver.name);
- if (gpiob_spi_drivers[port_index][adc].driver.name)
- kfree(gpiob_spi_drivers[port_index][adc].driver.name);
-
- // unregister SPI drivers
- spi_unregister_driver(&gpiob_spi_drivers[port_index][dout]);
- spi_unregister_driver(&gpiob_spi_drivers[port_index][din]);
- spi_unregister_driver(&gpiob_spi_drivers[port_index][adc]);
-
- return true;
-}
-
-bool set_gpiob_info(struct ap_info* info) {
- snprintf(info->product_id, 32, "%s", PRODUCT_ID_MTAC_GPIOB);
- info->setup = &gpiob_setup;
- info->teardown = &gpiob_teardown;
- info->gpio_pin_name_by_attr_name = &gpiob_gpio_pin_name_by_attr_name;
-
- return true;
-}
diff --git a/io-module/mtac_lora.c b/io-module/mtac_lora.c
deleted file mode 100644
index 60bab06..0000000
--- a/io-module/mtac_lora.c
+++ /dev/null
@@ -1,233 +0,0 @@
-static char* lora_gpio_pin_name_by_attr_name(const char* name, int port) {
- switch (port) {
- case port_1:
- if (! strcmp(name, "reset")) {
- return "ap1-reset";
- } else if (!strcmp(name,"cdone")) {
- return "ap1-cdone";
- } else if (!strcmp(name,"creset")) {
- return "ap1-creset";
- } else {
- log_error("attribute name [%s] is invalid for LORA in port %d", name, port);
- return "";
- }
-
- case port_2:
- if (! strcmp(name, "reset")) {
- return "ap2-reset";
- } else if (!strcmp(name,"cdone")) {
- return "ap2-cdone";
- } else if (!strcmp(name,"creset")) {
- return "ap2-creset";
- } else {
- log_error("attribute name [%s] is invalid for LORA in port %d", name, port);
- return "";
- }
- }
-}
-
-// 1 reset
-// 1 vendor-id
-// 1 product-id
-// 1 device-id
-// 1 hw-version
-// 1 eui
-// 1 cdone
-// 1 creset
-// NULL
-static size_t ap_lora_attrs_size = 9;
-
-// Set the hardware version if the ROM string matches one of the valid
-// hardware versions.
-// Lengths of strings must be the same for a match, then can compare
-// text. Without a length check a subset of a string could be a match.
-#define COMPARE_AND_ASSIGN(CANDIDATE) ((hw_version_len == (sizeof(HW_VERSION_ ## CANDIDATE)-1)) && \
- (strncmp(ap_eeprom[port_index].hw_version, HW_VERSION_ ## CANDIDATE, sizeof(HW_VERSION_ ## CANDIDATE)) == 0)) \
- lora_hw_version = CANDIDATE;
-
-static bool lora_setup(enum ap port) {
- int i;
- int port_index = port - 1;
- int index = 0;
- int count = 0;
- int ret;
- char buf[32];
- struct kobj_attribute* attr;
- struct attribute **attrs;
- int lora_hw_version;
- int hw_version_len;
-
- log_info("loading LORA accessory card in port %d", port);
-
- sprintf(buf, "ap%d", port);
- ap_subdirs[port_index] = kobject_create_and_add(buf, &mts_io_platform_device->dev.kobj);
- if (! ap_subdirs[port_index]) {
- log_error("kobject_create_and_add in port %d failed", port);
- return false;
- }
-
- // create the link to the apX directory this card is in
- // if we're in the first slot, we get plain "lora"
- // if we're in a different slot, we might need to use "lora-2" to differentiate
- if (port > 1) {
- for (i = 1; i < port; i++) {
- if (port_info[i - 1]) {
- if (strstr(port_info[i - 1]->product_id, PRODUCT_ID_MTAC_LORA)) {
- count++;
- }
- }
- }
- }
- if (count > 0) {
- sprintf(buf, "lora-%d", count + 1);
- } else {
- sprintf(buf, "lora");
- }
- ret = sysfs_create_link(ap_subdirs[port_index]->parent, ap_subdirs[port_index], buf);
- if (ret) {
- log_error("failed to link [%s] to [%s], %d", buf, ap_subdirs[port_index]->name, ret);
- } else
- log_info("created link [%s] to [%s], success:%d", buf, ap_subdirs[port_index]->name, ret);
-
- attrs = kzalloc(sizeof(struct attribute*) * ap_lora_attrs_size, GFP_KERNEL);
- if (! attrs) {
- log_error("failed to allocate attribute space for port %d", port);
- return false;
- }
-
- // hw_version string length, null character not counted.
- hw_version_len = strnlen(ap_eeprom[port_index].hw_version,sizeof ap_eeprom[port_index].hw_version);
-
- if COMPARE_AND_ASSIGN(MTAC_LORA_0_0)
- else if COMPARE_AND_ASSIGN(MTAC_LORA_1_0)
- else if COMPARE_AND_ASSIGN(MTAC_LORA_1_5)
- else {
- log_error("Unknown hw-version in port %d", port);
- kfree(attrs);
- return false;
- }
-
- // add reset line attribute for MTAC_LORA_0_0
- if ((lora_hw_version == MTAC_LORA_0_0) || (lora_hw_version == MTAC_LORA_1_0)) {
- sprintf(buf, "reset");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for LORA in port %d", buf, port);
- kfree(attrs);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
- }
- else if (lora_hw_version == MTAC_LORA_1_5) {
- int ipin = 0;
- // Substitute pins for this port
- log_info("Substitute pins");
- while(*(lora_h[port_index][ipin].name)) {
- struct gpio_pin *p;
- p = gpio_pin_by_num(lora_h[port_index][ipin].pin.gpio);
- if(p) {
- log_info("LORA H: Replace name %s with name %s",p->name,lora_h[port_index][ipin].name);
- log_info("LORA H: Replace pin number %u with number %u",p->pin.gpio,lora_h[port_index][ipin].pin.gpio);
- *p = lora_h[port_index][ipin];
- }
- ipin++;
- }
-
- //add support for reset
- sprintf(buf, "reset");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for LORA in port %d", buf, port);
- kfree(attrs);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- //GPIO1 - cdone on FPGA - input to CPU
- sprintf(buf, "cdone");
- attr = create_attribute(buf, MTS_ATTR_MODE_RO);
- if (! attr) {
- log_error("failed to create attribute [%s] for LORA in port %d", buf, port);
- kfree(attrs);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- //GPIO2 reset on FPGA - output from CPU
- sprintf(buf, "creset");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for LORA in port %d", buf, port);
- kfree(attrs);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
- if(index >= ap_lora_attrs_size) {
- panic("Internal error, too many attributes on the LORA card index %d >= %d",
- index,ap_lora_attrs_size);
- }
- }
-
- // add attributes for eeprom contents
- ret = ap_add_product_info_attributes(port, lora_hw_version, attrs, &index);
-
- attrs[index] = NULL; // Terminate the array.
- ap_attr_groups[port_index].attrs = attrs; // attrs available for teardown.
-
- if (!ret) {
- log_error("failed to add product info attributes for LORA in port %d", port);
- return false;
- }
- log_info("ap_subdirs[port_index=%d] = %p ap_subdirs[port_index=%d]=%p",
- port_index,ap_subdirs[port_index],port_index,&ap_attr_groups[port_index]);
- if (sysfs_create_group(ap_subdirs[port_index], &ap_attr_groups[port_index])) {
- log_error("sysfs_create_group failed for LORA in port %d", port);
- return false;
- }
-
- return true;
-}
-
-static bool lora_teardown(enum ap port) {
- int i;
- int port_index = port - 1;
- struct attribute **attrs = ap_attr_groups[port_index].attrs;
-
- log_info("unloading LORA accessory card in port %d", port);
-
- if(attrs) {
- // clean up allocated memory for attributes
- for (i = 0; i < ap_lora_attrs_size; i++) {
- if (attrs[i]) {
- if (attrs[i]->name)
- kfree(attrs[i]->name);
-
- kfree(attrs[i]);
- }
- }
-
- kfree(attrs);
- }
- // clean up our "apX/" kobject if it exists
- if (ap_subdirs[port_index]) {
- kobject_put(ap_subdirs[port_index]);
- }
-
- return true;
-}
-
-bool set_lora_info(struct ap_info* info) {
- snprintf(info->product_id, 32, "%s", PRODUCT_ID_MTAC_LORA);
- info->setup = &lora_setup;
- info->teardown = &lora_teardown;
- info->gpio_pin_name_by_attr_name = &lora_gpio_pin_name_by_attr_name;
-
- return true;
-}
diff --git a/io-module/mtac_mfser.c b/io-module/mtac_mfser.c
deleted file mode 100644
index 26fd339..0000000
--- a/io-module/mtac_mfser.c
+++ /dev/null
@@ -1,286 +0,0 @@
-static char* mfser_gpio_pin_name_by_attr_name(const char* name, int port) {
- switch (port) {
- case port_1:
- if (! strcmp(name, "rs4xx-term-res")) {
- return "ap1-gpio3";
- } else if (! strcmp(name, "rts-override")) {
- return "ap1-gpio4";
- } else {
- log_error("attirbute name [%s] is invalid for MFSER in port %d", name, port);
- return "";
- }
-
- case port_2:
- if (! strcmp(name, "rs4xx-term-res")) {
- return "ap2-gpio3";
- } else if (! strcmp(name, "rts-override")) {
- return "ap2-gpio4";
- } else {
- log_error("attirbute name [%s] is invalid for MFSER in port %d", name, port);
- return "";
- }
- }
- return "";
-}
-
-static ssize_t mts_attr_show_mfser_mode(struct kobject *kobj,
- struct kobj_attribute *attr,
- char *buf)
-{
- int ret;
- int port;
- int modesel0;
- int modesel1;
-
- struct gpio_pin *pin_modesel0;
- struct gpio_pin *pin_modesel1;
-
- port = port_from_kobject(kobj);
- if (port < 0) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
-
- switch (port) {
- case port_1:
- pin_modesel0 = gpio_pin_by_name("AP1_GPIO1");
- pin_modesel1 = gpio_pin_by_name("AP1_GPIO2");
- break;
-
- case port_2:
- pin_modesel0 = gpio_pin_by_name("AP2_GPIO1");
- pin_modesel1 = gpio_pin_by_name("AP2_GPIO2");
- break;
-
- default:
- log_error("unknown serial-mode attr [%s]", attr->attr.name);
- return -ENODEV;
- }
-
- if (!pin_modesel0 || !pin_modesel1)
- return -ENODEV;
-
- mutex_lock(&mts_io_mutex);
-
- modesel0 = gpio_get_value(pin_modesel0->pin.gpio);
- modesel1 = gpio_get_value(pin_modesel1->pin.gpio);
-
- if (modesel1 == 0 && modesel0 == 0)
- ret = sprintf(buf, "loopback\n");
- else if (modesel1 == 0 && modesel0 == 1)
- ret = sprintf(buf, "rs232\n");
- else if (modesel1 == 1 && modesel0 == 0)
- ret = sprintf(buf, "rs485-half\n");
- else if (modesel1 == 1 && modesel0 == 1)
- ret = sprintf(buf, "rs422-485-full\n");
- else
- ret = sprintf(buf, "error\n");
-
- mutex_unlock(&mts_io_mutex);
-
- return ret;
-}
-
-static ssize_t mts_attr_store_mfser_mode(struct kobject *kobj,
- struct kobj_attribute *attr, const char *buf, size_t count)
-{
- int port;
- int modesel0;
- int modesel1;
- struct gpio_pin *pin_modesel0;
- struct gpio_pin *pin_modesel1;
-
- port = port_from_kobject(kobj);
- if (port < 0) {
- log_error("port_from_kobject returned %d", port);
- return -EINVAL;
- }
-
- switch (port) {
- case port_1:
- pin_modesel0 = gpio_pin_by_name("AP1_GPIO1");
- pin_modesel1 = gpio_pin_by_name("AP1_GPIO2");
- break;
-
- case port_2:
- pin_modesel0 = gpio_pin_by_name("AP2_GPIO1");
- pin_modesel1 = gpio_pin_by_name("AP2_GPIO2");
- break;
-
- default:
- log_error("unknown serial-mode attr [%s]", attr->attr.name);
- return -ENODEV;
- }
-
- if (!pin_modesel0 || !pin_modesel1)
- return -ENODEV;
-
- if (!strcasecmp(buf, "loopback")) {
- modesel1 = 0;
- modesel0 = 0;
- }
- else if (!strcasecmp(buf, "rs232")) {
- modesel1 = 0;
- modesel0 = 1;
- }
- else if (!strcasecmp(buf, "rs485-half")) {
- modesel1 = 1;
- modesel0 = 0;
- }
- else if (!strcasecmp(buf, "rs422-485-full")) {
- modesel1 = 1;
- modesel0 = 1;
- }
- else {
- return -EINVAL;
- }
-
- mutex_lock(&mts_io_mutex);
-
- gpio_set_value(pin_modesel0->pin.gpio, modesel0);
- gpio_set_value(pin_modesel1->pin.gpio, modesel1);
-
- mutex_unlock(&mts_io_mutex);
-
- return count;
-}
-
-// 1 serial mode
-// 1 rs4xx term resistor
-// 1 rts override
-// 1 vendor-id
-// 1 product-id
-// 1 device-id
-// 1 hw-version
-// NULL
-static size_t ap_mfser_attrs_size = 8;
-
-static bool mfser_setup(enum ap port) {
- int i;
- int port_index = port - 1;
- int index = 0;
- int count = 0;
- int ret;
- char buf[32];
- struct kobj_attribute* attr;
- struct attribute **attrs;
-
- log_info("loading MFSER accessory card in port %d", port);
-
- sprintf(buf, "ap%d", port);
- ap_subdirs[port_index] = kobject_create_and_add(buf, &mts_io_platform_device->dev.kobj);
- if (! ap_subdirs[port_index]) {
- log_error("kobject_create_and_add for MFSER in port %d failed", port);
- return false;
- }
-
- // create the link to the apX directory this card is in
- // if we're in the first slot, we get plain "mfser"
- // if we're in a different slot, we might need to use "mfser-2" to differentiate
- if (port > 1) {
- for (i = 1; i < port; i++) {
- if (port_info[i - 1]) {
- if (strstr(port_info[i - 1]->product_id, PRODUCT_ID_MTAC_MFSER)) {
- count++;
- }
- }
- }
- }
- if (count > 0) {
- sprintf(buf, "mfser-%d", count + 1);
- } else {
- sprintf(buf, "mfser");
- }
- ret = sysfs_create_link(ap_subdirs[port_index]->parent, ap_subdirs[port_index], buf);
- if (ret) {
- log_error("failed to link [%s] to [%s], %d", buf, ap_subdirs[port_index]->name, ret);
- }
-
- attrs = kzalloc(sizeof(struct attribute*) * ap_mfser_attrs_size, GFP_KERNEL);
- if (! attrs) {
- log_error("failed to allocate attribute space for port %d", port);
- return false;
- }
-
- sprintf(buf, "serial-mode");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for MFSER in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_mfser_mode;
- attr->store = mts_attr_store_mfser_mode;
- attrs[index++] = &attr->attr;
-
- sprintf(buf, "rs4xx-term-res");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for MFSER in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- sprintf(buf, "rts-override");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (! attr) {
- log_error("failed to create attribute [%s] for MFSER in port %d", buf, port);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- // add attributes for eeprom contents
- if (! ap_add_product_info_attributes(port, MTAC_MFSER_0_0, attrs, &index)) {
- log_error("failed to add product info attributes for MFSER in port %d", port);
- return false;
- }
-
- attrs[index] = NULL;
-
- ap_attr_groups[port_index].attrs = attrs;
- if (sysfs_create_group(ap_subdirs[port_index], &ap_attr_groups[port_index])) {
- log_error("sysfs_create_group failed for MFSER in port %d", port);
- return false;
- }
-
- return true;
-}
-
-static bool mfser_teardown(enum ap port) {
- int i;
- int port_index = port - 1;
- struct attribute **attrs = ap_attr_groups[port_index].attrs;
-
- log_info("unloading MFSER accessory card in port %d", port);
-
- // clean up allocated memory for attributes
- for (i = 0; i < ap_mfser_attrs_size; i++) {
- if (attrs[i]) {
- if (attrs[i]->name)
- kfree(attrs[i]->name);
-
- kfree(attrs[i]);
- }
- }
-
- kfree(attrs);
-
- // clean up our "apX/" kobject if it exists
- if (ap_subdirs[port_index]) {
- kobject_put(ap_subdirs[port_index]);
- }
-
- return true;
-}
-
-bool set_mfser_info(struct ap_info* info) {
- snprintf(info->product_id, 32, "%s", PRODUCT_ID_MTAC_MFSER);
- info->setup = &mfser_setup;
- info->teardown = &mfser_teardown;
- info->gpio_pin_name_by_attr_name = &mfser_gpio_pin_name_by_attr_name;
-
- return true;
-}
diff --git a/io-module/mtac_pulse.c b/io-module/mtac_pulse.c
deleted file mode 100644
index dae4fa6..0000000
--- a/io-module/mtac_pulse.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/**********************************************************************
- * COPYRIGHT 2012-2018 CONNECTED DEVELOPMENT, LLC
- *
- * ALL RIGHTS RESERVED BY AND FOR THE EXCLUSIVE BENEFIT OF
- * CONNECTED DEVELOPMENT, LLC.
- *
- * CONNECTED DEVELOPMENT, LLC - CONFIDENTIAL AND PROPRIETARY
- * INFORMATION AND/OR TRADE SECRET.
- *
- * NOTICE: ALL CODE, PROGRAM, INFORMATION, SCRIPT, INSTRUCTION,
- * DATA, AND COMMENT HEREIN IS AND SHALL REMAIN THE CONFIDENTIAL
- * INFORMATION AND PROPERTY OF CONNECTED DEVELOPMENT, LLC.
- * USE AND DISCLOSURE THEREOF, EXCEPT AS STRICTLY AUTHORIZED IN A
- * WRITTEN AGREEMENT SIGNED BY CONNECTED DEVELOPMENT, LLC IS PROHIBITED.
- *
- ***********************************************************************/
-
-static char* pulse_gpio_pin_name_by_attr_name(const char *name, int port) {
- switch (port) {
- case port_1:
- if (!strcmp(name, "reset")) {
- return "ap1-reset";
- } else if (!strcmp(name, "auto-boot")) {
- return "ap1-gpio1";
- } else {
- log_error("attirbute name [%s] is invalid for pulse in port %d",
- name, port);
- return "";
- }
-
- case port_2:
- if (!strcmp(name, "reset")) {
- return "ap2-reset";
- } else if (!strcmp(name, "auto-boot")) {
- return "ap2-gpio1";
- } else {
- log_error("attirbute name [%s] is invalid for pulse in port %d",
- name, port);
- return "";
- }
- }
-}
-
-// 1 reset
-// 1 auto-boot
-// 1 vendor-id
-// 1 product-id
-// 1 device-id
-// 1 hw-version
-// NULL
-static size_t ap_pulse_attrs_size = 7;
-
-static bool pulse_setup(enum ap port) {
- int i;
- int port_index = port - 1;
- int index = 0;
- int count = 0;
- int ret;
- char buf[32];
- struct kobj_attribute *attr;
- struct attribute **attrs;
-
- log_info("loading pulse accessory card in port %d", port);
-
- sprintf(buf, "ap%d", port);
- ap_subdirs[port_index] = kobject_create_and_add(buf,
- &mts_io_platform_device->dev.kobj);
- if (!ap_subdirs[port_index]) {
- log_error("kobject_create_and_add in port %d failed", port);
- return false;
- }
-
- // create the link to the apX directory this card is in
- // if we're in the first slot, we get plain "pulse"
- // if we're in a different slot, we might need to use "pulse-2" to differentiate
- if (port > 1) {
- for (i = 1; i < port; i++) {
- if (port_info[i - 1]) {
- if (strstr(port_info[i - 1]->product_id,
- PRODUCT_ID_MTAC_PULSE)) {
- count++;
- }
- }
- }
- }
- if (count > 0) {
- sprintf(buf, "pulse-%d", count + 1);
- } else {
- sprintf(buf, "pulse");
- }
- ret = sysfs_create_link(ap_subdirs[port_index]->parent,
- ap_subdirs[port_index], buf);
- if (ret) {
- log_error("failed to link [%s] to [%s], %d", buf,
- ap_subdirs[port_index]->name, ret);
- } else {
- log_info("created link [%s] to [%s], success:%d", buf,
- ap_subdirs[port_index]->name, ret);
- }
-
- attrs = kzalloc(sizeof(struct attribute *) * ap_pulse_attrs_size,
- GFP_KERNEL);
- if (!attrs) {
- log_error("failed to allocate attribute space for port %d", port);
- return false;
- }
-
- sprintf(buf, "reset");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (!attr) {
- log_error("failed to create attribute [%s] for pulse in port %d", buf,
- port);
- kfree(attrs);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- sprintf(buf, "auto-boot");
- attr = create_attribute(buf, MTS_ATTR_MODE_RW);
- if (!attr) {
- log_error("failed to create attribute [%s] for pulse in port %d", buf,
- port);
- kfree(attrs);
- return false;
- }
- attr->show = mts_attr_show_ap_gpio_pin;
- attr->store = mts_attr_store_ap_gpio_pin;
- attrs[index++] = &attr->attr;
-
- // add attributes for eeprom contents
- if (!ap_add_product_info_attributes(port, MTAC_PULSE_1_0, attrs, &index)) {
- log_error("failed to add product info attributes for pulse in port %d",
- port);
- return false;
- }
-
- attrs[index] = NULL;
-
- ap_attr_groups[port_index].attrs = attrs;
- if (sysfs_create_group(ap_subdirs[port_index],
- &ap_attr_groups[port_index])) {
- log_error("sysfs_create_group failed for pulse in port %d", port);
- return false;
- }
-
- /* override ap_reset output mode to open drain */
- int res;
- if (port == 1) {
- res = gpio_request_one(AT91_PIN_PB12, GPIOF_OUT_INIT_HIGH | GPIOF_OPEN_DRAIN, "ap1-reset");
- } else {
- res = gpio_request_one(AT91_PIN_PB13, GPIOF_OUT_INIT_HIGH | GPIOF_OPEN_DRAIN, "ap2-reset");
- }
- if (res != 0)
- {
- log_error("failed to change ap%d_reset to open drain output", port);
- }
-
- return true;
-}
-
-static bool pulse_teardown(enum ap port) {
- int i;
- int port_index = port - 1;
- struct attribute **attrs = ap_attr_groups[port_index].attrs;
-
- log_info("unloading pulse accessory card in port %d", port);
-
- if (attrs) {
- // clean up allocated memory for attributes
- for (i = 0; i < ap_pulse_attrs_size; i++) {
- if (attrs[i]) {
- if (attrs[i]->name)
- kfree(attrs[i]->name);
-
- kfree(attrs[i]);
- }
- }
-
- kfree(attrs);
- }
- // clean up our "apX/" kobject if it exists
- if (ap_subdirs[port_index]) {
- kobject_put(ap_subdirs[port_index]);
- }
-
- return true;
-}
-
-bool set_pulse_info(struct ap_info *info) {
- snprintf(info->product_id, 32, "%s", PRODUCT_ID_MTAC_PULSE);
- info->setup = &pulse_setup;
- info->teardown = &pulse_teardown;
- info->gpio_pin_name_by_attr_name = &pulse_gpio_pin_name_by_attr_name;
-
- return true;
-}
-
diff --git a/io-module/mtcdt.c b/io-module/mtcdt.c
index 0fca7aa..cb46a0d 100644
--- a/io-module/mtcdt.c
+++ b/io-module/mtcdt.c
@@ -1,6 +1,6 @@
/*
* Within a struct gpio_pin, there is only one
- * occurance of each pin, so there is only one
+ * occurrence of each pin, so there is only one
* pin label set for each gpio pin.
*/
static struct gpio_pin gpio_pins_mtcdt_0_0[] = {
@@ -131,142 +131,6 @@ static struct gpio_pin gpio_pins_mtcdt_0_0[] = {
},
.active_low = 1,
},
-
- // gpio pins for Accessory Card 1
- {
- .name = "AP1_RESET",
- .pin = {
- .gpio = AT91_PIN_PB12,
- .flags = GPIOF_OUT_INIT_HIGH,
- .label = "ap1-reset",
- }
- },
- {
- .name = "AP1_GPIO1",
- .pin = {
- .gpio = AT91_PIN_PC6,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio1",
- },
- .active_low = 1,
- },
- {
- .name = "AP1_GPIO2",
- .pin = {
- .gpio = AT91_PIN_PC7,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio2",
- }
- },
- {
- .name = "AP1_GPIO3",
- .pin = {
- .gpio = AT91_PIN_PC8,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio3",
- }
- },
- {
- .name = "AP1_GPIO4",
- .pin = {
- .gpio = AT91_PIN_PC9,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio4",
- }
- },
- {
- .name = "AP1_INTERRUPT1",
- .pin = {
- .gpio = AT91_PIN_PB14,
- .flags = GPIOF_IN,
- .label = "ap1-interrupt1",
- }
- },
- {
- .name = "AP1_INTERRUPT2",
- .pin = {
- .gpio = AT91_PIN_PB15,
- .flags = GPIOF_IN,
- .label = "ap1-interrupt2",
- }
- },
- {
- .name = "AP1_GPS_PPS",
- .pin = {
- .gpio = AT91_PIN_PA29,
- .flags = GPIOF_IN,
- .label = "ap1-gps-pps",
- }
- },
-
- // gpio pins for Accessory Card 2
- {
- .name = "AP2_RESET",
- .pin = {
- .gpio = AT91_PIN_PB13,
- .flags = GPIOF_OUT_INIT_HIGH,
- .label = "ap2-reset",
- }
- },
- {
- .name = "AP2_GPIO1",
- .pin = {
- .gpio = AT91_PIN_PC20,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio1",
- },
- .active_low = 1,
- },
- {
- .name = "AP2_GPIO2",
- .pin = {
- .gpio = AT91_PIN_PC21,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio2",
- }
- },
- {
- .name = "AP2_GPIO3",
- .pin = {
- .gpio = AT91_PIN_PC22,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio3",
- }
- },
- {
- .name = "AP2_GPIO4",
- .pin = {
- .gpio = AT91_PIN_PC23,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio4",
- }
- },
- {
- .name = "AP2_INTERRUPT1",
- .pin = {
- .gpio = AT91_PIN_PB17,
- .flags = GPIOF_IN,
- .label = "ap2-interrupt1",
- }
- },
- {
- .name = "AP2_INTERRUPT2",
- .pin = {
- .gpio = AT91_PIN_PB18,
- .flags = GPIOF_IN,
- .label = "ap2-interrupt2",
- }
- },
- {
- .name = "AP2_GPS_PPS",
- .pin = {
- .gpio = AT91_PIN_PA6,
- .flags = GPIOF_IN,
- .label = "ap2-gps-pps",
- }
- },
-
- { },
};
static struct gpio_pin gpio_pins_mtcdt_0_1[] = {
@@ -389,133 +253,6 @@ static struct gpio_pin gpio_pins_mtcdt_0_1[] = {
},
.active_low = 1,
},
-
- // gpio pins for Accessory Card 1
- {
- .name = "AP1_RESET",
- .pin = {
- .gpio = AT91_PIN_PB12,
- .flags = GPIOF_OUT_INIT_HIGH,
- .label = "ap1-reset",
- }
- },
- {
- .name = "AP1_GPIO1",
- .pin = {
- .gpio = AT91_PIN_PC6,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio1",
- },
- .active_low = 1,
- },
- {
- .name = "AP1_GPIO2",
- .pin = {
- .gpio = AT91_PIN_PC7,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio2",
- }
- },
- {
- .name = "AP1_GPIO3",
- .pin = {
- .gpio = AT91_PIN_PC8,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio3",
- }
- },
- {
- .name = "AP1_GPIO4",
- .pin = {
- .gpio = AT91_PIN_PC9,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap1-gpio4",
- }
- },
- {
- .name = "AP1_INTERRUPT1",
- .pin = {
- .gpio = AT91_PIN_PB14,
- .flags = GPIOF_IN,
- .label = "ap1-interrupt1",
- }
- },
- {
- .name = "AP1_INTERRUPT2",
- .pin = {
- .gpio = AT91_PIN_PB15,
- .flags = GPIOF_IN,
- .label = "ap1-interrupt2",
- }
- },
-
- // gpio pin for Accessory Card 2
- {
- .name = "AP2_RESET",
- .pin = {
- .gpio = AT91_PIN_PB13,
- .flags = GPIOF_OUT_INIT_HIGH,
- .label = "ap2-reset",
- }
- },
- {
- .name = "ETH_RESET",
- .pin = {
- .gpio = AT91_PIN_PC4,
- .flags = GPIOF_OUT_INIT_HIGH,
- .label = "eth-reset",
- }
- },
- // gpio pin for Accessory Card 2
- {
- .name = "AP2_GPIO1",
- .pin = {
- .gpio = AT91_PIN_PC20,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio1",
- },
- .active_low = 1,
- },
- {
- .name = "AP2_GPIO2",
- .pin = {
- .gpio = AT91_PIN_PC21,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio2",
- }
- },
- {
- .name = "AP2_GPIO3",
- .pin = {
- .gpio = AT91_PIN_PC22,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio3",
- }
- },
- {
- .name = "AP2_GPIO4",
- .pin = {
- .gpio = AT91_PIN_PC23,
- .flags = GPIOF_OUT_INIT_LOW,
- .label = "ap2-gpio4",
- }
- },
- {
- .name = "AP2_INTERRUPT1",
- .pin = {
- .gpio = AT91_PIN_PB17,
- .flags = GPIOF_IN,
- .label = "ap2-interrupt1",
- }
- },
- {
- .name = "AP2_INTERRUPT2",
- .pin = {
- .gpio = AT91_PIN_PB18,
- .flags = GPIOF_IN,
- .label = "ap2-interrupt2",
- }
- },
{
.name = "WIFI_BT_ULPWKUP",
.pin = {
diff --git a/io-module/mths.c b/io-module/mths.c
index 224e918..36f4325 100644
--- a/io-module/mths.c
+++ b/io-module/mths.c
@@ -560,9 +560,6 @@ static DEVICE_ATTR_MTS(dev_attr_led_bt_gpio_mths, "led-bt",
static DEVICE_ATTR_MTS(dev_attr_led_f_gpio_mths, "led-f",
mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
-static DEVICE_ATTR_MTS(dev_attr_led_e_gpio_mths, "led-e",
- mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
-
static DEVICE_ATTR_RO_MTS(dev_attr_wifi_mac_mths, "mac-wifi",
mts_attr_show_product_info);
diff --git a/io-module/mtr.c b/io-module/mtr.c
index cb9de17..7dfc49c 100644
--- a/io-module/mtr.c
+++ b/io-module/mtr.c
@@ -1476,12 +1476,6 @@ static DEVICE_ATTR_RO_MTS(dev_attr_radio_wm_lk_m, "radio-wm-lk-m",
mts_attr_show_gpio_pin);
-static int
-is_radio_power_attr_mtr(struct attribute *attr)
-{
- return (attr == &dev_attr_radio_power_mtr.attr);
-}
-
static struct attribute *mtr_platform_attributes[] = {
&dev_attr_vendor_id.attr,
&dev_attr_product_id.attr,
diff --git a/io-module/mts-io.c b/io-module/mts-io.c
index d127fe2..da02ce8 100644
--- a/io-module/mts-io.c
+++ b/io-module/mts-io.c
@@ -45,33 +45,30 @@
#include <linux/io.h>
#include <linux/module.h>
+#include "mts_io_module.h"
#include "mts_io.h"
+/*
+#include "mtac.h"
+*/
#include "buttons.h"
#define PLATFORM_NAME "mts-io"
#define LED_LS_CONTROLLABLE 0
+int mtsio_reread_eeprom = 0;
+module_param(mtsio_reread_eeprom, int, S_IRUSR | S_IRGRP | S_IROTH);
+MODULE_PARM_DESC(mtsio_reread_eeprom, "Non-zero means re-read EEPROM");
+
/* on-board EEPROM */
extern uint8_t mts_id_eeprom[512];
static struct mts_id_eeprom_layout id_eeprom;
-// NUM_AP should be defined from the board code
-// it should be set to the value of CONFIG_MTS_NUM_ACCESSORY_PORTS
-// arch/arm/mach-at91/board-dt-sam9.c
-// if it is 0 or undefined, there is no accessory card support on this HW
-#ifdef CONFIG_MTS_NUM_ACCESSORY_PORTS
-
-#ifndef NUM_AP
-#define NUM_AP CONFIG_MTS_NUM_ACCESSORY_PORTS
-#endif
+uint8_t mts_hw_version;
-#else
-#define NUM_AP 0
-#endif
+struct platform_device *mts_io_platform_device;
+EXPORT_SYMBOL(mts_io_platform_device);
-static uint8_t mts_hw_version;
-static struct platform_device *mts_io_platform_device;
static struct attribute_group *attr_group;
static struct attribute_group *attr_group_lora; // on-board lora peripheral to be stored in the lora/ sub-directory
static struct gpio_pin *gpio_pins;
@@ -102,14 +99,7 @@ static void radio_reset_timer_callback(unsigned long data);
#define RESET_HOLD_COUNT (RESET_CHECK_PER_SEC * 3)
#define RESET_LONG_HOLD_COUNT (RESET_CHECK_PER_SEC * 30)
-static pid_t reset_pid = -1;
-static pid_t reset_count = 0;
bool sent_extra_long = false;
-static int reset_short_signal = SIGUSR1;
-static int reset_long_signal = SIGUSR2;
-static int reset_extra_long_signal = SIGHUP;
-static int reset_short_interval = RESET_HOLD_COUNT;
-static int reset_long_interval = RESET_LONG_HOLD_COUNT;
/*
* This function takes the product_id and tries to check
@@ -449,14 +439,6 @@ static DEVICE_ATTR_MTS(dev_attr_led_status, "led-status",
static DEVICE_ATTR_MTS(dev_attr_led_a_gpio, "led-a",
mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
-#if LED_LS_CONTROLLABLE
-static DEVICE_ATTR_MTS(dev_attr_led_ls, "led-ls",
- mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
-#else
-static DEVICE_ATTR_RO_MTS(dev_attr_led_ls, "led-ls",
- mts_attr_show_gpio_pin);
-#endif
-
static DEVICE_ATTR_MTS(dev_attr_led_b_gpio, "led-b",
mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
@@ -477,6 +459,7 @@ static DEVICE_ATTR_MTS(dev_attr_led_d_gpio, "led-d",
static DEVICE_ATTR_MTS(dev_attr_led_e_gpio, "led-e",
mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+
/* eeprom info */
static ssize_t mts_attr_show_product_info(struct device *dev,
struct device_attribute *attr,
@@ -576,174 +559,490 @@ static int get_radio_model_from_product_id(void) {
return rc;
}
-
/* include on-board lora peripheral */
#include "mts_lora.c"
-/* include per-device pins and attributes */
-#include "mtcdt.c"
-#include "mtcap.c"
-#include "mtr.c"
-#include "mths.c"
-
-/* include capabilities sub-directory support */
-#include "mts_capab.c"
-
-
-#if NUM_AP > 0
-
-/* accessory card EEPROMs */
-extern uint8_t mts_ap_eeprom[NUM_AP][512];
-static struct mts_ap_eeprom_layout ap_eeprom[NUM_AP];
-/* kobject pointers for the apX subdirectories that correspond to the accessory ports */
-static struct kobject *ap_subdirs[NUM_AP];
-/* attribute groups for the accessory ports*/
-static struct attribute_group ap_attr_groups[NUM_AP];
-/* info for accessory port (contains function pointers for setup and teardown and and useful info) */
-static struct ap_info* port_info[NUM_AP];
-
-/* accessory card support */
-#include "mtac.c"
-#include "mtac_gpiob.c"
-#include "mtac_mfser.c"
-#include "mtac_eth.c"
-#include "mtac_lora.c"
-#include "mtac_pulse.c"
-
-static bool load_port(int port) {
- int port_index = port - 1;
- memcpy(&ap_eeprom[port_index], mts_ap_eeprom[port_index], sizeof(mts_ap_eeprom[port_index]));
-
- if (mts_ap_eeprom[port_index][0] == 0xFF) {
- log_error("uninitialized eeprom on accessory card %d", port);
- } else if (mts_ap_eeprom[port_index][0] == 0x00) {
- log_info("no accessory card inserted in port %d", port);
- } else {
- port_info[port_index] = kzalloc(sizeof(struct ap_info), GFP_KERNEL);
- if (! port_info[port_index]) {
- log_error("alloc of port info failed");
- return false;
- }
-
- if (strstr(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_GPIOB)) {
- if (! set_gpiob_info(port_info[port_index])) {
- log_error("failed to set up gpiob port info");
- return false;
- }
- } else if (strstr(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_MFSER)) {
- if (! set_mfser_info(port_info[port_index])) {
- log_error("failed to set up mfser port info");
- return false;
- }
- } else if (strstr(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_ETH)) {
- if (! set_eth_info(port_info[port_index])) {
- log_error("failed to set up eth port info");
- return false;
- }
- } else if (strstr(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_LORA)) {
- if (! set_lora_info(port_info[port_index])) {
- log_error("failed to set up lora port info");
- return false;
- }
- } else if (strstr(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_PULSE)) {
- if (! set_pulse_info(port_info[port_index])) {
- log_error("failed to set up pulse port info");
- return false;
- }
- } else {
- log_error("unknown accessory card [%s] in port %d", ap_eeprom[port_index].product_id, port);
- kfree(port_info[port_index]);
- port_info[port_index] = NULL;
- return false;
+/* Start of mtcdt.c */
+/*
+ * Within a struct gpio_pin, there is only one
+ * occurance of each pin, so there is only one
+ * pin label set for each gpio pin.
+ */
+static struct gpio_pin gpio_pins_mtcdt_0_0[] = {
+ {
+ .name = "RADIO_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC3,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "radio-reset",
+ },
+ },
+ {
+ .name = "RADIO_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC3,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "radio-power",
+ },
+ },
+ {
+ .name = "DEVICE_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC2,
+ .flags = GPIOF_IN,
+ .label = "reset",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "ETH_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC4,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "eth-reset",
}
-
- log_info("accessory card %d vendor-id: %.32s", port, ap_eeprom[port_index].vendor_id);
- log_info("accessory card %d product-id: %.32s", port, ap_eeprom[port_index].product_id);
- log_info("accessory card %d device-id: %.32s", port, ap_eeprom[port_index].device_id);
- log_info("accessory card %d hw-version: %.32s", port, ap_eeprom[port_index].hw_version);
- if (strncmp(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_ETH, strlen(PRODUCT_ID_MTAC_ETH)) == 0) {
- log_info("accessory card %d mac-addr: %02X:%02X:%02X:%02X:%02X:%02X",
- port,
- ap_eeprom[port_index].mac_addr[0],
- ap_eeprom[port_index].mac_addr[1],
- ap_eeprom[port_index].mac_addr[2],
- ap_eeprom[port_index].mac_addr[3],
- ap_eeprom[port_index].mac_addr[4],
- ap_eeprom[port_index].mac_addr[5]);
+ },
+ {
+ .name = "LS_LED", /* LED7 */
+ .pin = {
+ .gpio = AT91_PIN_PA14,
+#if LED_LS_CONTROLLABLE
+ .flags = GPIOF_OUT_INIT_HIGH,
+#else
+ .flags = GPIOF_IN,
+#endif
+ .label = "led-ls",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "STATUS_LED", /* LED2 */
+ .pin = {
+ .gpio = AT91_PIN_PA24,
+ .flags = GPIOF_OUT_INIT_LOW,
+ .label = "led-status",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED5",
+ .pin = {
+ .gpio = AT91_PIN_PA25,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-cd",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED5",
+ .pin = {
+ .gpio = AT91_PIN_PA25,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-a",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED1",
+ .pin = {
+ .gpio = AT91_PIN_PA26,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-sig1",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED1",
+ .pin = {
+ .gpio = AT91_PIN_PA26,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-b",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED4",
+ .pin = {
+ .gpio = AT91_PIN_PA27,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-sig2",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED4",
+ .pin = {
+ .gpio = AT91_PIN_PA27,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-c",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED3",
+ .pin = {
+ .gpio = AT91_PIN_PA28,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-sig3",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED3",
+ .pin = {
+ .gpio = AT91_PIN_PA28,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-d",
+ },
+ .active_low = 1,
+ },
+};
+
+
+static struct gpio_pin gpio_pins_mtcdt_0_1[] = {
+ {
+ .name = "RADIO_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC3,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "radio-reset",
+ },
+ },
+ {
+ .name = "RADIO_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC3,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "radio-power",
+ },
+ },
+ {
+ .name = "DEVICE_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PC2,
+ .flags = GPIOF_IN,
+ .label = "reset",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LS_LED", /* LED7 */
+ .pin = {
+ .gpio = AT91_PIN_PA14,
+#if LED_LS_CONTROLLABLE
+ .flags = GPIOF_OUT_INIT_HIGH,
+#else
+ .flags = GPIOF_IN,
+#endif
+ .label = "led-ls",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "STATUS_LED", /* LED2 */
+ .pin = {
+ .gpio = AT91_PIN_PA24,
+ .flags = GPIOF_OUT_INIT_LOW,
+ .label = "led-status",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED5",
+ .pin = {
+ .gpio = AT91_PIN_PA25,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-cd",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED5",
+ .pin = {
+ .gpio = AT91_PIN_PA25,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-a",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED1",
+ .pin = {
+ .gpio = AT91_PIN_PA26,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-sig1",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED1",
+ .pin = {
+ .gpio = AT91_PIN_PA26,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-b",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED4",
+ .pin = {
+ .gpio = AT91_PIN_PA27,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-sig2",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED4",
+ .pin = {
+ .gpio = AT91_PIN_PA27,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-c",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED3",
+ .pin = {
+ .gpio = AT91_PIN_PA28,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-sig3",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "LED3",
+ .pin = {
+ .gpio = AT91_PIN_PA28,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "led-d",
+ },
+ .active_low = 1,
+ },
+ {
+ .name = "WIFI_BT_ULPWKUP",
+ .pin = {
+ .gpio = AT91_PIN_PA0,
+ .flags = GPIOF_IN,
+ .label = "wifi-bt-ulpwkup",
+ },
+ .capability = CAPA_WIFI,
+ },
+ {
+ .name = "WIFI_BT_LPWKUP",
+ .pin = {
+ .gpio = AT91_PIN_PA6,
+ .flags = GPIOF_IN,
+ .label = "wifi-bt-lpwkup",
+ },
+ .capability = CAPA_WIFI,
+ },
+ {
+ .name = "WIFI_BT_INT",
+ .pin = {
+ .gpio = AT91_PIN_PB11,
+ .flags = GPIOF_IN,
+ .label = "wifi-bt-int",
+ },
+ .capability = CAPA_WIFI,
+ },
+ {
+ .name = "WIFI_BT_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PD14,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "wifi-bt-reset",
+ },
+ .capability = CAPA_WIFI,
+ },
+ {
+ .name = "GNSS_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PD15,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "gnss-reset",
+ },
+ .capability = CAPA_GPS,
+ },
+ {
+ .name = "SECURE_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PD16,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "secure-reset",
}
- if (strncmp(ap_eeprom[port_index].product_id, PRODUCT_ID_MTAC_LORA, strlen(PRODUCT_ID_MTAC_LORA)) == 0) {
- log_info("accessory card %d eui: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
- port,
- ap_eeprom[port_index].eui[0],
- ap_eeprom[port_index].eui[1],
- ap_eeprom[port_index].eui[2],
- ap_eeprom[port_index].eui[3],
- ap_eeprom[port_index].eui[4],
- ap_eeprom[port_index].eui[5],
- ap_eeprom[port_index].eui[6],
- ap_eeprom[port_index].eui[7]);
+ },
+ {
+ .name = "MTQ_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PD17,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "mtq-reset",
}
-
- if (! port_info[port_index]->setup(port)) {
- log_error("accessory port %d setup failed", port);
- port_info[port_index]->teardown(port);
- kfree(port_info[port_index]);
- port_info[port_index] = NULL;
- return false;
+ },
+ {
+ .name = "USBHUB_RESET",
+ .pin = {
+ .gpio = AT91_PIN_PD18,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "usbhub-reset",
}
- }
-
- return true;
-}
+ },
+ {
+ .name = "GNSS_INT",
+ .pin = {
+ .gpio = AT91_PIN_PD19,
+ .flags = GPIOF_OUT_INIT_HIGH,
+ .label = "gnss-int",
+ },
+ .capability = CAPA_GPS,
+ },
+ {
+ .name = "WIFI_BT_LPMODE",
+ .pin = {
+ .gpio = AT91_PIN_PD20,
+ .flags = GPIOF_IN,
+ .label = "wifi-bt-lpmode",
+ },
+ .capability = CAPA_WIFI,
+ },
+ { },
+};
+
+static DEVICE_ATTR_MTS(dev_attr_wifi_bt_lpwkup, "wifi-bt-lpwkup",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_wifi_bt_ulpwkup, "wifi-bt-ulpwkup",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_wifi_bt_reset, "wifi-bt-reset",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+static DEVICE_ATTR_RO_MTS(dev_attr_wifi_bt_lpmode, "wifi-bt-lpmode",
+ mts_attr_show_gpio_pin);
+static DEVICE_ATTR_RO_MTS(dev_attr_wifi_bt_int, "wifi-bt-int",
+ mts_attr_show_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_gnss_reset, "gnss-reset",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_usbhub_reset, "usbhub-reset",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_eth_reset, "eth-reset",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_gnss_int, "gnss-int",
+ mts_attr_show_gpio_pin, mts_attr_store_gpio_pin);
-static void init_accessory_ports(void)
-{
- int port_index;
- for (port_index = 0; port_index < NUM_AP; port_index++) {
- port_info[port_index] = NULL;
- if (! load_port(port_index+1)) {
- log_error("failed to load accessory card in port %d", port_index);
- }
- }
-}
-static void teardown_accessory_ports(void)
-{
- int port_index;
+static struct attribute *mtcdt_platform_attributes[] = {
+ &dev_attr_vendor_id.attr,
+ &dev_attr_product_id.attr,
+ &dev_attr_device_id.attr,
+ &dev_attr_uuid.attr,
+ &dev_attr_hw_version.attr,
+ &dev_attr_imei.attr,
+ &dev_attr_eth_mac.attr,
+ &dev_attr_has_radio.attr,
+ &dev_attr_reset.attr,
+ &dev_attr_reset_monitor.attr,
+ &dev_attr_reset_monitor_intervals.attr,
+
+ &dev_attr_led_status.attr,
+ &dev_attr_led_cd_gpio.attr,
+ &dev_attr_led_sig1_gpio.attr,
+ &dev_attr_led_sig2_gpio.attr,
+ &dev_attr_led_sig3_gpio.attr,
+
+ &dev_attr_led_a_gpio.attr,
+ &dev_attr_led_b_gpio.attr,
+ &dev_attr_led_c_gpio.attr,
+ &dev_attr_led_d_gpio.attr,
+ &dev_attr_eth_reset.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,
+ NULL,
+};
+
+static struct attribute *mtcdt_0_1_platform_attributes[] = {
+ &dev_attr_vendor_id.attr,
+ &dev_attr_product_id.attr,
+ &dev_attr_device_id.attr,
+ &dev_attr_uuid.attr,
+ &dev_attr_hw_version.attr,
+ &dev_attr_imei.attr,
+ &dev_attr_eth_mac.attr,
+ &dev_attr_has_radio.attr,
+ &dev_attr_reset.attr,
+ &dev_attr_reset_monitor.attr,
+ &dev_attr_reset_monitor_intervals.attr,
+
+ &dev_attr_led_status.attr,
+ &dev_attr_led_cd_gpio.attr,
+ &dev_attr_led_sig1_gpio.attr,
+ &dev_attr_led_sig2_gpio.attr,
+ &dev_attr_led_sig3_gpio.attr,
+
+ &dev_attr_led_a_gpio.attr,
+ &dev_attr_led_b_gpio.attr,
+ &dev_attr_led_c_gpio.attr,
+ &dev_attr_led_d_gpio.attr,
+
+ &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() searches
+ // for this for truncation.
+ &dev_attr_radio_power.attr, /* Must be first radio attribute */
+ &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,
+};
+
+static struct attribute *mtcdt_0_1_wifi_bt_attributes[] = {
+ &dev_attr_wifi_bt_lpwkup.attr,
+ &dev_attr_wifi_bt_ulpwkup.attr,
+ &dev_attr_wifi_bt_reset.attr,
+ &dev_attr_wifi_bt_lpmode.attr,
+ &dev_attr_wifi_bt_int.attr,
+};
+
+static struct attribute *mtcdt_0_1_gnss_attributes[] = {
+ &dev_attr_gnss_reset.attr,
+ &dev_attr_gnss_int.attr,
+};
+
+
+static struct attribute_group mtcdt_platform_attribute_group = {
+ .attrs = mtcdt_platform_attributes
+};
+static struct attribute_group mtcdt_0_1_platform_attribute_group = {
+ .attrs = mtcdt_0_1_platform_attributes
+};
- for (port_index = 0; port_index < NUM_AP; port_index++) {
- if (port_info[port_index]) {
- port_info[port_index]->teardown(port_index+1);
- kfree(port_info[port_index]);
- }
- }
-}
-#else /* NUM_AP > 0 */
-static void init_accessory_ports(void) {}
-static void teardown_accessory_ports(void) {}
-#endif
-static void init_ports(void)
+static int
+is_radio_power_attr_mtcdt(struct attribute *attr)
{
- if (DEVICE_CAPA(id_eeprom.capa, CAPA_LORA) && attr_group_lora) {
- mts_load_lora_port();
- }
-
- init_accessory_ports();
+ return (attr == &dev_attr_radio_power.attr);
}
+/* End of mths.c */
-static void teardown_ports(void)
-{
- if (DEVICE_CAPA(id_eeprom.capa, CAPA_LORA) && attr_group_lora) {
- mts_teardown_lora_port();
- }
+#include "mtcap.c"
+#include "mtr.c"
+#include "mths.c"
- teardown_accessory_ports();
-}
+/* include capabilities sub-directory support */
+#include "mts_capab.c"
-struct attribute *freelater = NULL; // Storage to free when driver is unloaded.
+struct attribute **freelater = NULL; // Storage to free when driver is unloaded.
static int
mts_id_eeprom_load(void)
@@ -1021,11 +1320,11 @@ mts_id_eeprom_load(void)
static void cleanup(void)
{
log_info("cleaning up....");
+
if (mts_io_platform_device) {
platform_device_unregister(mts_io_platform_device);
}
- teardown_ports();
if(freelater) {
kfree(freelater);
freelater = NULL;
@@ -1060,7 +1359,9 @@ static int __init mts_io_init(void)
return ret;
}
- init_ports();
+ if (DEVICE_CAPA(id_eeprom.capa, CAPA_LORA) && attr_group_lora) {
+ mts_load_lora_port();
+ }
ret = mts_capab_dir_create();
if (ret) {
@@ -1093,14 +1394,21 @@ static int __init mts_io_init(void)
static void __exit mts_io_exit(void)
{
+ struct gpio_pin *pin;
/* delete radio_reset_timer */
del_timer(&radio_reset_timer);
/* delete radio_reset_available_timer */
del_timer(&radio_reset_available_timer);
+ for (pin = gpio_pins; *pin->name; pin++)
+ if (pin->capability == 0 || DEVICE_CAPA(id_eeprom.capa,pin->capability))
+ gpio_free(pin->pin.gpio);
+
cleanup_buttons();
cleanup();
-
+ if (DEVICE_CAPA(id_eeprom.capa, CAPA_LORA) && attr_group_lora) {
+ mts_teardown_lora_port();
+ }
log_info("exiting");
}
@@ -1111,10 +1419,3 @@ MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_VERSION(DRIVER_VERSION);
MODULE_LICENSE("GPL");
-
-MODULE_ALIAS("mts-io-ap1-dout");
-MODULE_ALIAS("mts-io-ap1-din");
-MODULE_ALIAS("mts-io-ap1-adc");
-MODULE_ALIAS("mts-io-ap2-dout");
-MODULE_ALIAS("mts-io-ap2-din");
-MODULE_ALIAS("mts-io-ap2-adc");
diff --git a/io-module/mts_eeprom.h b/io-module/mts_eeprom.h
index 4e15f8c..478a107 100644
--- a/io-module/mts_eeprom.h
+++ b/io-module/mts_eeprom.h
@@ -64,4 +64,4 @@ do { \
/* Used for rs9113 detection in Conduit 0.1 and others */
#define CAPA_WIFI DEVICE_CAPA_VALUE(1, 6)
#define CAPA_LORA DEVICE_CAPA_VALUE(1, 3) // on-board lora
-#endif
+#endif /* __MTS_EEPROM_H */
diff --git a/io-module/mts_io.h b/io-module/mts_io.h
index 9f82991..5e83879 100644
--- a/io-module/mts_io.h
+++ b/io-module/mts_io.h
@@ -4,11 +4,7 @@
#include "mts_eeprom.h"
#include <linux/gpio.h>
-
-#define DRIVER_VERSION "v2.2.2"
-#define DRIVER_AUTHOR "James Maki <jmaki@multitech.com>"
-#define DRIVER_DESC "MTS-IO Controller"
-#define DRIVER_NAME "mts-io"
+/* Note that this header file is used by the MTAC driver. */
#define __log(level, name, format, args...) \
printk(level "[" name "] " DRIVER_NAME ":%s:%d: " format "\n" , \
@@ -44,75 +40,7 @@ struct device_attribute mts_dev_name = { \
}
#define VENDOR_ID_MULTITECH "Multi-Tech Systems"
-#define PRODUCT_ID_MTCDP_E1_DK "MTCDP-E1-DK"
-#define PRODUCT_ID_MT100EOCG "MT100EOCG"
-#define PRODUCT_ID_MTR "MTR"
-#define PRODUCT_ID_MTCDT "MTCDT"
-#define PRODUCT_ID_MTCAP "MTCAP"
-#define PRODUCT_ID_MTCDTIP "MTCDTIP"
-#define PRODUCT_ID_MTCDTIPHP "MTCDTIPHP"
-
-#define PRODUCT_ID_MTAC_GPIOB "MTAC-GPIOB"
-#define PRODUCT_ID_MTAC_MFSER "MTAC-MFSER"
-#define PRODUCT_ID_MTAC_ETH "MTAC-ETH"
-#define PRODUCT_ID_MTAC_LORA "MTAC-LORA"
-#define PRODUCT_ID_MTHS "MTHS"
-#define PRODUCT_ID_MTAC_PULSE "MTAC-PULSE"
-
-/* Hardware version must be fewer characters than hw_version
- in struct mts_ap_eeprom_layout */
-/* MTAC-LORA with native SPI or FTDI FT4222 */
-#define HW_VERSION_MTAC_LORA_0_0 "MTAC-LORA-0.0"
-/* MTAC-LORA2 with FTDI FT232H */
-#define HW_VERSION_MTAC_LORA_1_0 "MTAC-LORA-1.0"
-#define HW_VERSION_MTAC_LORA_1_1 "MTAC-LORA-1.1"
-#define HW_VERSION_MTAC_LORA_1_5 "MTAC-LORA-1.5"
-#define HW_VERSION_MTCBA2_2_0 "MTCBA2-2.0"
-#define HW_VERSION_MTCDP_0_0 "MTCDP-0.0"
-#define HW_VERSION_MTCDP_1_0 "MTCDP-1.0"
-#define HW_VERSION_MT100EOCG_0_0 "MT100EOCG-0.0"
-#define HW_VERSION_MTR_0_0 "MTR-0.0"
-#define HW_VERSION_MTR_0_1 "MTR-0.1"
-#define HW_VERSION_MTRV1_0_0 "MTRV1-0.0"
-#define HW_VERSION_MTRV1_0_1 "MTRV1-0.1"
-#define HW_VERSION_MTRV1_0_2 "MTRV1-0.2" // Cat M
-#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"
-#define HW_VERSION_MTHS_0_0 "MTHS-0.0"
-
-enum {
- MTCDP_E1_DK_0_0,
- MTCDP_E1_DK_1_0,
- MT100EOCG_0_0,
- MTR_0_0,
- MTR_0_1,
- MTRV1_0_0,
- MTRV1_0_1,
- MTRV1_0_2,
- MTCDT_0_0,
- MTCDT_0_1,
- MTCDTIPHP_0_0,
- MTCAP_0_0,
- MTCAP_0_1,
- MTHS_0_0,
-};
-
-enum {
- MTAC_NONE,
- MTAC_GPIOB_0_0,
- MTAC_MFSER_0_0,
- MTAC_ETH_0_0,
- MTAC_LORA_0_0,
- MTAC_LORA_1_0,
- MTAC_LORA_1_1,
- MTAC_LORA_1_5,
- MTAC_PULSE_1_0,
-};
struct gpio_pin {
char name[32];
@@ -121,41 +49,6 @@ struct gpio_pin {
uint8_t capability;
};
-enum {
- LED_OFF,
- LED_ON,
- LED_FLASHING,
-};
-
-enum {
- RADIO_UNKNOWN,
- RADIO_LEU1, // LE910-EUG
- RADIO_LEU3, // LE910-EU1
- RADIO_LNA3, // LE910-NA1
-};
-
-enum ap {
- port_1 = 1,
- port_2,
-};
-
-enum spi_devices {
- din = 0,
- dout = 1,
- adc = 2,
-};
-
-// info for accessory port
-// contains function pointers for setup and teardown and useful info
-// each type of accessory card should have one of these
-struct ap_info {
- char product_id[32];
- bool (*setup)(enum ap port);
- bool (*teardown)(enum ap port);
- char* (*gpio_pin_name_by_attr_name)(const char* name, int port);
-};
-
-extern struct mutex mts_io_mutex;
-#endif /* ~__MTS_IO_H */
+#endif /* __MTS_IO_H */
diff --git a/io-module/mts_io_module.h b/io-module/mts_io_module.h
new file mode 100644
index 0000000..b7e5237
--- /dev/null
+++ b/io-module/mts_io_module.h
@@ -0,0 +1,74 @@
+#ifndef __MTS_IO_MODULE_H
+#define __MTS_IO_MODULE_H
+
+/* Specific to mts-io module, and not used by the
+ * MTAC cards.
+ */
+
+#define DRIVER_VERSION "v3.0.0"
+#define DRIVER_AUTHOR "James Maki <jmaki@multitech.com>"
+#define DRIVER_DESC "MTS-IO Controller"
+#define DRIVER_NAME "mts-io"
+#define DEBUG 0
+
+
+#define PRODUCT_ID_MTCDP_E1_DK "MTCDP-E1-DK"
+#define PRODUCT_ID_MT100EOCG "MT100EOCG"
+#define PRODUCT_ID_MTR "MTR"
+#define PRODUCT_ID_MTCDT "MTCDT"
+#define PRODUCT_ID_MTCAP "MTCAP"
+#define PRODUCT_ID_MTCDTIP "MTCDTIP"
+#define PRODUCT_ID_MTCDTIPHP "MTCDTIPHP"
+#define PRODUCT_ID_MTHS "MTHS"
+
+#define HW_VERSION_MTCBA2_2_0 "MTCBA2-2.0"
+#define HW_VERSION_MTCDP_0_0 "MTCDP-0.0"
+#define HW_VERSION_MTCDP_1_0 "MTCDP-1.0"
+#define HW_VERSION_MT100EOCG_0_0 "MT100EOCG-0.0"
+#define HW_VERSION_MTR_0_0 "MTR-0.0"
+#define HW_VERSION_MTR_0_1 "MTR-0.1"
+#define HW_VERSION_MTRV1_0_0 "MTRV1-0.0"
+#define HW_VERSION_MTRV1_0_1 "MTRV1-0.1"
+#define HW_VERSION_MTRV1_0_2 "MTRV1-0.2" // Cat M
+#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"
+#define HW_VERSION_MTHS_0_0 "MTHS-0.0"
+
+enum {
+ MTCDP_E1_DK_0_0,
+ MTCDP_E1_DK_1_0,
+ MT100EOCG_0_0,
+ MTR_0_0,
+ MTR_0_1,
+ MTRV1_0_0,
+ MTRV1_0_1,
+ MTRV1_0_2,
+ MTCDT_0_0,
+ MTCDT_0_1,
+ MTCDTIPHP_0_0,
+ MTCAP_0_0,
+ MTCAP_0_1,
+ MTHS_0_0,
+};
+
+enum {
+ LED_OFF,
+ LED_ON,
+ LED_FLASHING,
+};
+
+enum {
+ RADIO_UNKNOWN,
+ RADIO_LEU1, // LE910-EUG
+ RADIO_LEU3, // LE910-EU1
+ RADIO_LNA3, // LE910-NA1
+};
+
+extern struct mutex mts_io_mutex;
+
+
+#endif /* __MTS_IO_MODULE_H */