diff options
Diffstat (limited to 'io-module/mts_lora.c')
-rw-r--r-- | io-module/mts_lora.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/io-module/mts_lora.c b/io-module/mts_lora.c new file mode 100644 index 0000000..7b7e204 --- /dev/null +++ b/io-module/mts_lora.c @@ -0,0 +1,114 @@ +static struct kobject *mts_lora_kobject; + +static void mts_load_lora_port(void) +{ + // create lora/ subdir + mts_lora_kobject = kobject_create_and_add("lora", &mts_io_platform_device->dev.kobj); + + if (sysfs_create_group(mts_lora_kobject, attr_group_lora)) { + log_error("failed to create lora attributes"); + } +} + +static void mts_teardown_lora_port(void) +{ + // clean up "lora/" kobject if it exists + if (mts_lora_kobject) { + kobject_put(mts_lora_kobject); + } +} + +static ssize_t mts_attr_show_lora_product_info(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + ssize_t value; + + char label[32]; + snprintf(label, sizeof label, "%s/%s", kobj->name, attr->attr.name); + + if (strcmp(label, "lora/eui") == 0) { + value = sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", + id_eeprom.lora_eui[0], + id_eeprom.lora_eui[1], + id_eeprom.lora_eui[2], + id_eeprom.lora_eui[3], + id_eeprom.lora_eui[4], + id_eeprom.lora_eui[5], + id_eeprom.lora_eui[6], + id_eeprom.lora_eui[7]); + } + else if (strcmp(label, "lora/product-id") == 0) { + value = sprintf(buf, "%.32s\n", id_eeprom.lora_product_id); + } + else if (strcmp(label, "lora/hw-version") == 0) { + value = sprintf(buf, "%.32s\n", id_eeprom.lora_hw_version); + } + else { + log_error("attribute '%s' not found", label); + value = -1; + } + return value; +} + +static ssize_t mts_attr_show_lora_gpio_pin(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + int value; + struct gpio_pin *pin; + + char pin_label[32]; + snprintf(pin_label, sizeof pin_label, "%s/%s", kobj->name, attr->attr.name); // ex. lora/reset + + pin = gpio_pin_by_attr_name(pin_label); + 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_lora_gpio_pin(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + int value; + struct gpio_pin *pin; + char pin_label[32]; + + snprintf(pin_label, sizeof pin_label, "%s/%s", kobj->name, attr->attr.name); // ex. lora/reset + + pin = gpio_pin_by_attr_name(pin_label); + 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; +} |