From 67c2858334b99ff5bdfa4400b980abd9b82e528a Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Fri, 2 Jun 2006 12:01:47 +0000 Subject: [PATCH] EEPROM write enable SysFS entry. --- master/master.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- master/master.h | 2 ++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/master/master.c b/master/master.c index 0499b6e0..7d5fe1ac 100644 --- a/master/master.c +++ b/master/master.c @@ -58,6 +58,8 @@ void ec_master_freerun(void *); void ec_master_eoe_run(unsigned long); ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); +ssize_t ec_store_master_attribute(struct kobject *, struct attribute *, + const char *, size_t); /*****************************************************************************/ @@ -65,16 +67,18 @@ ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); EC_SYSFS_READ_ATTR(slave_count); EC_SYSFS_READ_ATTR(mode); +EC_SYSFS_READ_WRITE_ATTR(eeprom_write_enable); static struct attribute *ec_def_attrs[] = { &attr_slave_count, &attr_mode, + &attr_eeprom_write_enable, NULL, }; static struct sysfs_ops ec_sysfs_ops = { .show = &ec_show_master_attribute, - .store = NULL + .store = ec_store_master_attribute }; static struct kobj_type ktype_ec_master = { @@ -244,6 +248,8 @@ void ec_master_reset(ec_master_t *master /**< EtherCAT master */) master->release_cb = NULL; master->cb_data = NULL; + master->eeprom_write_enable = 0; + ec_fsm_reset(&master->fsm); } @@ -824,6 +830,44 @@ ssize_t ec_show_master_attribute(struct kobject *kobj, /**< kobject */ /*****************************************************************************/ +/** + Formats attribute data for SysFS write access. + \return number of bytes processed, or negative error code +*/ + +ssize_t ec_store_master_attribute(struct kobject *kobj, /**< slave's kobject */ + struct attribute *attr, /**< attribute */ + const char *buffer, /**< memory with data */ + size_t size /**< size of data to store */ + ) +{ + ec_master_t *master = container_of(kobj, ec_master_t, kobj); + + if (attr == &attr_eeprom_write_enable) { + if (!strcmp(buffer, "1\n")) { + master->eeprom_write_enable = 1; + EC_INFO("Slave EEPROM writing enabled.\n"); + return size; + } + else if (!strcmp(buffer, "0\n")) { + master->eeprom_write_enable = 0; + EC_INFO("Slave EEPROM writing disabled.\n"); + return size; + } + + EC_ERR("Invalid value for eeprom_write_enable!\n"); + + if (master->eeprom_write_enable) { + master->eeprom_write_enable = 0; + EC_INFO("Slave EEPROM writing disabled.\n"); + } + } + + return -EINVAL; +} + +/*****************************************************************************/ + /** Starts Ethernet-over-EtherCAT processing for all EoE-capable slaves. */ diff --git a/master/master.h b/master/master.h index 0523e5ac..543417c4 100644 --- a/master/master.h +++ b/master/master.h @@ -122,6 +122,8 @@ struct ec_master int (*request_cb)(void *); /**< lock request callback */ void (*release_cb)(void *); /**< lock release callback */ void *cb_data; /**< data parameter of locking callbacks */ + + uint8_t eeprom_write_enable; /**< allow write operations to EEPROMs */ }; /*****************************************************************************/