summaryrefslogtreecommitdiff
path: root/io-module/mtdc_gpiob.c
diff options
context:
space:
mode:
Diffstat (limited to 'io-module/mtdc_gpiob.c')
-rw-r--r--io-module/mtdc_gpiob.c289
1 files changed, 214 insertions, 75 deletions
diff --git a/io-module/mtdc_gpiob.c b/io-module/mtdc_gpiob.c
index c207483..5a592b7 100644
--- a/io-module/mtdc_gpiob.c
+++ b/io-module/mtdc_gpiob.c
@@ -1,16 +1,25 @@
-
-struct gpio_pin *dc_gpio_pin_by_attr_name(const char *name) {
+struct gpio_pin *ap_gpio_pin_by_attr_name(const char *name) {
struct gpio_pin *pin;
char *pin_attr_name;
- if (!strcmp(name, "led1")) {
- pin_attr_name = "dc-gpio1";
- } else if (!strcmp(name, "led2")) {
- pin_attr_name = "dc-gpio2";
- } else if (!strcmp(name, "dout-enable")) {
- pin_attr_name = "dc-gpio3";
+ if (!strcmp(name, "ap1-led1")) {
+ pin_attr_name = "ap1-gpio3";
+ } else if (!strcmp(name, "ap1-led2")) {
+ pin_attr_name = "ap1-gpio4";
+ } else if (!strcmp(name, "ap1-dout-enable")) {
+ pin_attr_name = "ap1-gpio1";
+ } else if (!strcmp(name, "ap1-reset")) {
+ pin_attr_name = "ap1-reset";
+ } else if (!strcmp(name, "ap2-led1")) {
+ pin_attr_name = "ap2-gpio3";
+ } else if (!strcmp(name, "ap2-led2")) {
+ pin_attr_name = "ap2-gpio4";
+ } else if (!strcmp(name, "ap2-dout-enable")) {
+ pin_attr_name = "ap2-gpio1";
+ } else if (!strcmp(name, "ap2-reset")) {
+ pin_attr_name = "ap2-reset";
} else {
- log_error("daughter card attribute %s not available", name);
+ log_error("accessory card attribute %s not available", name);
return NULL;
}
@@ -26,12 +35,12 @@ struct gpio_pin *dc_gpio_pin_by_attr_name(const char *name) {
}
-static ssize_t mts_attr_show_dc_gpio_pin(struct device *dev,
+static ssize_t mts_attr_show_ap_gpio_pin(struct device *dev,
struct device_attribute *attr,
char *buf)
{
int value;
- struct gpio_pin *pin = dc_gpio_pin_by_attr_name(attr->attr.name);
+ struct gpio_pin *pin = ap_gpio_pin_by_attr_name(attr->attr.name);
if (!pin) {
return -ENODEV;
@@ -54,11 +63,11 @@ static ssize_t mts_attr_show_dc_gpio_pin(struct device *dev,
return sprintf(buf, "%d\n", value);
}
-static ssize_t mts_attr_store_dc_gpio_pin(struct device *dev,
+static ssize_t mts_attr_store_ap_gpio_pin(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int value;
- struct gpio_pin *pin = dc_gpio_pin_by_attr_name(attr->attr.name);
+ struct gpio_pin *pin = ap_gpio_pin_by_attr_name(attr->attr.name);
if (!pin) {
return -ENODEV;
@@ -81,31 +90,46 @@ static ssize_t mts_attr_store_dc_gpio_pin(struct device *dev,
return count;
}
-static ssize_t mts_attr_show_dc_din(struct device *dev, struct device_attribute *attr, char *buf)
+static ssize_t mts_attr_show_ap_din(struct device *dev, struct device_attribute *attr, char *buf)
{
int tmp;
u8 bit;
u8 byte;
+ struct spi_device* spi_dev;
+
+ if (strstr(attr->attr.name, ":0")) {
+ if (!spi_ap1_din_dev) {
+ log_error("accessory card 1 din device not present");
+ return -ENODEV;
+ }
- if (!spi_dc_din_dev) {
- log_error("dc din device not present");
+ spi_dev = spi_ap1_din_dev;
+ } else if (strstr(attr->attr.name, ":1")) {
+ if (!spi_ap2_din_dev) {
+ log_error("accessory card 2 din device not present");
+ return -ENODEV;
+ }
+
+ spi_dev = spi_ap2_din_dev;
+ } else {
+ log_error("unknown din device %s", attr->attr.name);
return -ENODEV;
}
- if (!strcmp(attr->attr.name, "din0")) {
+ if (strstr(attr->attr.name, "din0")) {
bit = BIT(0);
- } else if (!strcmp(attr->attr.name, "din1")) {
+ } else if (strstr(attr->attr.name, "din1")) {
bit = BIT(1);
- } else if (!strcmp(attr->attr.name, "din2")) {
+ } else if (strstr(attr->attr.name, "din2")) {
bit = BIT(2);
- } else if (!strcmp(attr->attr.name, "din3")) {
+ } else if (strstr(attr->attr.name, "din3")) {
bit = BIT(3);
} else {
- log_error("dc din attr does not exist");
+ log_error("accessory card din attr does not exist");
return -ENOENT;
}
- tmp = spi_readn(spi_dc_din_dev, &byte, 1);
+ tmp = spi_readn(spi_dev, &byte, 1);
if (tmp) {
log_error("spi_read failed %d", tmp);
return tmp;
@@ -116,82 +140,112 @@ static ssize_t mts_attr_show_dc_din(struct device *dev, struct device_attribute
return sprintf(buf, "%d\n", tmp);
}
-static ssize_t mts_attr_store_dc_dout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+static ssize_t mts_attr_store_ap_dout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
int value;
u8 bit;
+ struct spi_device* spi_dev;
+
+ if (strstr(attr->attr.name, ":0")) {
+ if (!spi_ap1_dout_dev) {
+ log_error("accessory card 1 dout device not present");
+ return -ENODEV;
+ }
+
+ spi_dev = spi_ap1_dout_dev;
+ } else if (strstr(attr->attr.name, ":1")) {
+ if (!spi_ap2_dout_dev) {
+ log_error("accessory card 2 dout device not present");
+ return -ENODEV;
+ }
- if (!spi_dc_dout_dev) {
- log_error("dc dout device not present");
+ spi_dev = spi_ap2_dout_dev;
+ } else {
+ log_error("unknown dout device %s", attr->attr.name);
return -ENODEV;
}
- if (!strcmp(attr->attr.name, "dout0")) {
+ if (strstr(attr->attr.name, "dout0")) {
bit = BIT(0);
- } else if (!strcmp(attr->attr.name, "dout1")) {
+ } else if (strstr(attr->attr.name, "dout1")) {
bit = BIT(1);
- } else if (!strcmp(attr->attr.name, "dout2")) {
+ } else if (strstr(attr->attr.name, "dout2")) {
bit = BIT(2);
- } else if (!strcmp(attr->attr.name, "dout3")) {
+ } else if (strstr(attr->attr.name, "dout3")) {
bit = BIT(3);
} else {
- log_error("dc dout attr does not exist");
+ log_error("accessory card dout attr does not exist");
return -ENOENT;
}
if (sscanf(buf, "%i", &value) != 1) {
- log_error("dc dout attr invalid argument");
+ log_error("accessory card dout attr invalid argument");
return -EINVAL;
}
- mutex_lock(&spi_dc_dout_mutex);
+ mutex_lock(&spi_ap_dout_mutex);
if (value) {
- spi_dc_dout_value &= ~bit;
+ spi_ap_dout_value &= ~bit;
} else {
- spi_dc_dout_value |= bit;
+ spi_ap_dout_value |= bit;
}
- spi_writen(spi_dc_dout_dev, &spi_dc_dout_value, 1);
+ spi_writen(spi_dev, &spi_ap_dout_value, 1);
- mutex_unlock(&spi_dc_dout_mutex);
+ mutex_unlock(&spi_ap_dout_mutex);
return count;
}
-static ssize_t mts_attr_show_dc_dout(struct device *dev, struct device_attribute *attr, char *buf)
+static ssize_t mts_attr_show_ap_dout(struct device *dev, struct device_attribute *attr, char *buf)
{
int value;
u8 bit;
+ struct spi_device* spi_dev;
- if (!spi_dc_dout_dev) {
- log_error("dc dout device not present");
+ if (strstr(attr->attr.name, ":0")) {
+ if (!spi_ap1_dout_dev) {
+ log_error("accessory card 1 dout device not present");
+ return -ENODEV;
+ }
+
+ spi_dev = spi_ap1_dout_dev;
+ } else if (strstr(attr->attr.name, ":1")) {
+ if (!spi_ap2_dout_dev) {
+ log_error("accessory card 2 dout device not present");
+ return -ENODEV;
+ }
+
+ spi_dev = spi_ap2_dout_dev;
+ } else {
+ log_error("unknown dout device %s", attr->attr.name);
return -ENODEV;
}
- if (!strcmp(attr->attr.name, "dout0")) {
+ if (strstr(attr->attr.name, "dout0")) {
bit = BIT(0);
- } else if (!strcmp(attr->attr.name, "dout1")) {
+ } else if (strstr(attr->attr.name, "dout1")) {
bit = BIT(1);
- } else if (!strcmp(attr->attr.name, "dout2")) {
+ } else if (strstr(attr->attr.name, "dout2")) {
bit = BIT(2);
- } else if (!strcmp(attr->attr.name, "dout3")) {
+ } else if (strstr(attr->attr.name, "dout3")) {
bit = BIT(3);
} else {
- log_error("dc dout attr does not exist");
+ log_error("accessory card dout attr does not exist");
return -ENOENT;
}
- mutex_lock(&spi_dc_dout_mutex);
+ mutex_lock(&spi_ap_dout_mutex);
- value = spi_dc_dout_value & bit ? 0 : 1;
+ value = spi_ap_dout_value & bit ? 0 : 1;
- mutex_unlock(&spi_dc_dout_mutex);
+ mutex_unlock(&spi_ap_dout_mutex);
return sprintf(buf, "%d\n", value);
}
-static ssize_t mts_attr_show_dc_adc(struct device *dev, struct device_attribute *attr, char *buf)
+static ssize_t mts_attr_show_ap_adc(struct device *dev, struct device_attribute *attr, char *buf)
{
int tmp;
int tx_data;
@@ -201,23 +255,38 @@ static ssize_t mts_attr_show_dc_adc(struct device *dev, struct device_attribute
int manual_mode = 0x1840; /* 0b 0001 1000 0100 0000 */
uint8_t tx[2];
uint8_t rx[2];
-
- if (!spi_dc_adc_dev) {
- log_error("dc adc device not present");
- return -ENODEV;
- }
+ struct spi_device* spi_dev;
memset(tx, 0, sizeof(tx));
memset(rx, 0, sizeof(rx));
- if (!strcmp(attr->attr.name, "adc0")) {
+ if (strstr(attr->attr.name, ":0")) {
+ if (!spi_ap1_adc_dev) {
+ log_error("accessory card 1 adc device not present");
+ return -ENODEV;
+ }
+
+ spi_dev = spi_ap1_adc_dev;
+ } else if (strstr(attr->attr.name, ":1")) {
+ if (!spi_ap2_adc_dev) {
+ log_error("accessory card 2 adc device not present");
+ return -ENODEV;
+ }
+
+ spi_dev = spi_ap2_adc_dev;
+ } else {
+ log_error("unknown adc device %s", attr->attr.name);
+ return -ENODEV;
+ }
+
+ if (strstr(attr->attr.name, "adc0")) {
channel = 0;
- } else if (!strcmp(attr->attr.name, "adc1")) {
+ } else if (strstr(attr->attr.name, "adc1")) {
channel = 1;
- } else if (! strcmp(attr->attr.name, "adc2")) {
+ } else if (strstr(attr->attr.name, "adc2")) {
channel = 2;
} else {
- log_error("dc adc attr does not exist");
+ log_error("accessory card adc attr does not exist");
return -ENOENT;
}
@@ -225,7 +294,7 @@ static ssize_t mts_attr_show_dc_adc(struct device *dev, struct device_attribute
tx_data = manual_mode | ((channel << 7) & channel_mask);
tx[0] = tx_data >> 8;
tx[1] = tx_data & 0xFF;
- tmp = spi_writen(spi_dc_adc_dev, tx, 2);
+ tmp = spi_writen(spi_dev, tx, 2);
if (tmp) {
log_error("spi_write failed %d", tmp);
return tmp;
@@ -236,14 +305,14 @@ static ssize_t mts_attr_show_dc_adc(struct device *dev, struct device_attribute
* the ADC just needs the clock running so it can convert */
tx[0] = 0;
tx[1] = 0;
- tmp = spi_writen(spi_dc_adc_dev, tx, 2);
+ tmp = spi_writen(spi_dev, tx, 2);
if (tmp) {
log_error("2nd spi_write failed %d", tmp);
return tmp;
}
/* 3rd transfer to read data */
- tmp = spi_readn(spi_dc_adc_dev, rx, 2);
+ tmp = spi_readn(spi_dev, rx, 2);
if (tmp) {
log_error("spi_read failed %d", tmp);
return tmp;
@@ -253,18 +322,88 @@ static ssize_t mts_attr_show_dc_adc(struct device *dev, struct device_attribute
return sprintf(buf, "%lu\n", (unsigned long) rx_data);
}
-/* MTDC-GPIOB */
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_din0, "din0", mts_attr_show_dc_din);
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_din1, "din1", mts_attr_show_dc_din);
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_din2, "din2", mts_attr_show_dc_din);
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_din3, "din3", mts_attr_show_dc_din);
-static DEVICE_ATTR_MTS(dev_attr_dc_dout0, "dout0", mts_attr_show_dc_dout, mts_attr_store_dc_dout);
-static DEVICE_ATTR_MTS(dev_attr_dc_dout1, "dout1", mts_attr_show_dc_dout, mts_attr_store_dc_dout);
-static DEVICE_ATTR_MTS(dev_attr_dc_dout2, "dout2", mts_attr_show_dc_dout, mts_attr_store_dc_dout);
-static DEVICE_ATTR_MTS(dev_attr_dc_dout3, "dout3", mts_attr_show_dc_dout, mts_attr_store_dc_dout);
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_adc0, "adc0", mts_attr_show_dc_adc);
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_adc1, "adc1", mts_attr_show_dc_adc);
-static DEVICE_ATTR_RO_MTS(dev_attr_dc_adc2, "adc2", mts_attr_show_dc_adc);
-static DEVICE_ATTR_MTS(dev_attr_dc_led1, "led1", mts_attr_show_dc_gpio_pin, mts_attr_store_dc_gpio_pin);
-static DEVICE_ATTR_MTS(dev_attr_dc_led2, "led2", mts_attr_show_dc_gpio_pin, mts_attr_store_dc_gpio_pin);
-static DEVICE_ATTR_MTS(dev_attr_dc_oe, "dout-enable", mts_attr_show_dc_gpio_pin, mts_attr_store_dc_gpio_pin);
+/* accessory port 1 gpiob attributes */
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_din0, "din0:0", mts_attr_show_ap_din);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_din1, "din1:0", mts_attr_show_ap_din);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_din2, "din2:0", mts_attr_show_ap_din);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_din3, "din3:0", mts_attr_show_ap_din);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_dout0, "dout0:0", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_dout1, "dout1:0", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_dout2, "dout2:0", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_dout3, "dout3:0", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_adc0, "adc0:0", mts_attr_show_ap_adc);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_adc1, "adc1:0", mts_attr_show_ap_adc);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap1_gpio_adc2, "adc2:0", mts_attr_show_ap_adc);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_led1, "ap1-led1", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_led2, "ap1-led2", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_ap1_gpio_oe, "ap1-dout-enable", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_ap1_reset, "ap1-reset", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+
+static int ap1_gpio_attributes_size = 15; // not including NULL at end
+
+static struct attribute *ap1_gpio_attributes[] = {
+ &dev_attr_ap1_reset.attr,
+
+ &dev_attr_ap1_gpio_oe.attr, // gpio1
+ &dev_attr_ap1_gpio_led1.attr, // gpio3
+ &dev_attr_ap1_gpio_led2.attr, // gpio4
+
+ &dev_attr_ap1_gpio_din0.attr,
+ &dev_attr_ap1_gpio_din1.attr,
+ &dev_attr_ap1_gpio_din2.attr,
+ &dev_attr_ap1_gpio_din3.attr,
+
+ &dev_attr_ap1_gpio_dout0.attr,
+ &dev_attr_ap1_gpio_dout1.attr,
+ &dev_attr_ap1_gpio_dout2.attr,
+ &dev_attr_ap1_gpio_dout3.attr,
+
+ &dev_attr_ap1_gpio_adc0.attr,
+ &dev_attr_ap1_gpio_adc1.attr,
+ &dev_attr_ap1_gpio_adc2.attr,
+
+ NULL,
+};
+
+/* accessory port 2 gpiob attributes */
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_din0, "din0:1", mts_attr_show_ap_din);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_din1, "din1:1", mts_attr_show_ap_din);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_din2, "din2:1", mts_attr_show_ap_din);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_din3, "din3:1", mts_attr_show_ap_din);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_dout0, "dout0:1", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_dout1, "dout1:1", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_dout2, "dout2:1", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_dout3, "dout3:1", mts_attr_show_ap_dout, mts_attr_store_ap_dout);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_adc0, "adc0:1", mts_attr_show_ap_adc);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_adc1, "adc1:1", mts_attr_show_ap_adc);
+static DEVICE_ATTR_RO_MTS(dev_attr_ap2_gpio_adc2, "adc2:1", mts_attr_show_ap_adc);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_led1, "ap2-led1", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_led2, "ap2-led2", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_ap2_gpio_oe, "ap2-dout-enable", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+static DEVICE_ATTR_MTS(dev_attr_ap2_reset, "ap2-reset", mts_attr_show_ap_gpio_pin, mts_attr_store_ap_gpio_pin);
+
+static int ap2_gpio_attributes_size = 15; // not including NULL at end
+
+static struct attribute *ap2_gpio_attributes[] = {
+ &dev_attr_ap2_reset.attr,
+
+ &dev_attr_ap2_gpio_oe.attr, // gpio1
+ &dev_attr_ap2_gpio_led1.attr, // gpio3
+ &dev_attr_ap2_gpio_led2.attr, // gpio4
+
+ &dev_attr_ap2_gpio_din0.attr,
+ &dev_attr_ap2_gpio_din1.attr,
+ &dev_attr_ap2_gpio_din2.attr,
+ &dev_attr_ap2_gpio_din3.attr,
+
+ &dev_attr_ap2_gpio_dout0.attr,
+ &dev_attr_ap2_gpio_dout1.attr,
+ &dev_attr_ap2_gpio_dout2.attr,
+ &dev_attr_ap2_gpio_dout3.attr,
+
+ &dev_attr_ap2_gpio_adc0.attr,
+ &dev_attr_ap2_gpio_adc1.attr,
+ &dev_attr_ap2_gpio_adc2.attr,
+
+ NULL,
+};