diff options
-rw-r--r-- | NEWS | 10 | ||||
-rw-r--r-- | io-module/buttons.c | 2 | ||||
-rw-r--r-- | io-module/buttons.h | 3 | ||||
-rw-r--r-- | io-module/gpio.c | 1 | ||||
-rw-r--r-- | io-module/mtac.c | 258 | ||||
-rw-r--r-- | io-module/mtac_eth.c | 139 | ||||
-rw-r--r-- | io-module/mtac_gpiob.c | 598 | ||||
-rw-r--r-- | io-module/mtac_lora.c | 233 | ||||
-rw-r--r-- | io-module/mtac_mfser.c | 286 | ||||
-rw-r--r-- | io-module/mtac_pulse.c | 199 | ||||
-rw-r--r-- | io-module/mtcdt.c | 265 | ||||
-rw-r--r-- | io-module/mths.c | 3 | ||||
-rw-r--r-- | io-module/mtr.c | 6 | ||||
-rw-r--r-- | io-module/mts-io.c | 679 | ||||
-rw-r--r-- | io-module/mts_eeprom.h | 2 | ||||
-rw-r--r-- | io-module/mts_io.h | 111 | ||||
-rw-r--r-- | io-module/mts_io_module.h | 74 |
17 files changed, 582 insertions, 2287 deletions
@@ -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 = ð_setup; - info->teardown = ð_teardown; - info->gpio_pin_name_by_attr_name = ð_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 */ |