--- a/TODO Thu Jun 05 14:33:36 2008 +0000
+++ b/TODO Thu Jun 05 15:39:15 2008 +0000
@@ -9,6 +9,15 @@
Version 1.4.0:
* Replace all Sysfs files via the new ethercat tool.
+ - Sdo info
+ - Sdo entry info
+ - Sdo entry value read
+ - Sdo entry value write
+ - Slave alias write
+ - Slave SII write
+ - Slave state write
+ - Slave info
+ - Config info
* Remove the end state of the master state machine.
* Supply new ec_master_state_t.
* Implement ecrt_slave_config_state().
--- a/master/cdev.c Thu Jun 05 14:33:36 2008 +0000
+++ b/master/cdev.c Thu Jun 05 15:39:15 2008 +0000
@@ -143,7 +143,30 @@
// FIXME lock
switch (cmd) {
- case EC_IOCTL_SLAVE_COUNT:
+ case EC_IOCTL_MASTER:
+ {
+ ec_ioctl_master_t data;
+
+ data.slave_count = master->slave_count;
+ data.mode = (uint8_t) master->mode;
+
+ memcpy(data.devices[0].address, master->main_mac, ETH_ALEN);
+ data.devices[0].attached = master->main_device.dev ? 1 : 0;
+ data.devices[0].tx_count = master->main_device.tx_count;
+ data.devices[0].rx_count = master->main_device.rx_count;
+ memcpy(data.devices[1].address, master->backup_mac, ETH_ALEN);
+ data.devices[1].attached = master->backup_device.dev ? 1 : 0;
+ data.devices[1].tx_count = master->backup_device.tx_count;
+ data.devices[1].rx_count = master->backup_device.rx_count;
+
+ if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
+ retval = -EFAULT;
+ break;
+ }
+
+ break;
+ }
+
retval = master->slave_count;
break;
@@ -449,7 +472,7 @@
break;
}
- case EC_IOCTL_DEBUG_LEVEL:
+ case EC_IOCTL_SET_DEBUG:
if (ec_master_debug_level(master, (unsigned int) arg)) {
retval = -EINVAL;
}
--- a/master/ioctl.h Thu Jun 05 14:33:36 2008 +0000
+++ b/master/ioctl.h Thu Jun 05 15:39:15 2008 +0000
@@ -44,7 +44,7 @@
/*****************************************************************************/
enum {
- EC_IOCTL_SLAVE_COUNT,
+ EC_IOCTL_MASTER,
EC_IOCTL_SLAVE,
EC_IOCTL_SYNC,
EC_IOCTL_PDO,
@@ -53,11 +53,24 @@
EC_IOCTL_DOMAIN,
EC_IOCTL_DOMAIN_FMMU,
EC_IOCTL_DATA,
- EC_IOCTL_DEBUG_LEVEL,
+ EC_IOCTL_SET_DEBUG,
};
/*****************************************************************************/
+typedef struct {
+ unsigned int slave_count;
+ uint8_t mode;
+ struct {
+ uint8_t address[6];
+ uint8_t attached;
+ unsigned int tx_count;
+ unsigned int rx_count;
+ } devices[2];
+} ec_ioctl_master_t;
+
+/*****************************************************************************/
+
#define EC_IOCTL_SLAVE_NAME_SIZE 114
typedef struct {
--- a/tools/Master.cpp Thu Jun 05 14:33:36 2008 +0000
+++ b/tools/Master.cpp Thu Jun 05 15:39:15 2008 +0000
@@ -97,7 +97,7 @@
throw MasterException(err.str());
}
- if (ioctl(fd, EC_IOCTL_DEBUG_LEVEL, debugLevel) < 0) {
+ if (ioctl(fd, EC_IOCTL_SET_DEBUG, debugLevel) < 0) {
stringstream err;
err << "Failed to set debug level: " << strerror(errno);
throw MasterException(err.str());
@@ -156,6 +156,58 @@
/****************************************************************************/
+void Master::showMaster()
+{
+ ec_ioctl_master_t data;
+ stringstream err;
+ unsigned int i;
+
+ getMaster(&data);
+
+ cout
+ << "Master" << index << endl
+ << " State: ";
+
+ switch (data.mode) {
+ case 0: cout << "Waiting for device..."; break;
+ case 1: cout << "Idle"; break;
+ case 2: cout << "Operation"; break;
+ default:
+ err << "Invalid master state " << data.mode;
+ throw MasterException(err.str());
+ }
+
+ cout << endl
+ << " Slaves: " << data.slave_count << endl;
+
+ for (i = 0; i < 2; i++) {
+ cout << " Device" << i << ": ";
+ if (data.devices[i].address[0] == 0x00
+ && data.devices[i].address[1] == 0x00
+ && data.devices[i].address[2] == 0x00
+ && data.devices[i].address[3] == 0x00
+ && data.devices[i].address[4] == 0x00
+ && data.devices[i].address[5] == 0x00) {
+ cout << "None.";
+ } else {
+ cout << hex << setfill('0')
+ << setw(2) << (unsigned int) data.devices[i].address[0] << ":"
+ << setw(2) << (unsigned int) data.devices[i].address[1] << ":"
+ << setw(2) << (unsigned int) data.devices[i].address[2] << ":"
+ << setw(2) << (unsigned int) data.devices[i].address[3] << ":"
+ << setw(2) << (unsigned int) data.devices[i].address[4] << ":"
+ << setw(2) << (unsigned int) data.devices[i].address[5] << " ("
+ << (data.devices[i].attached ? "attached" : "waiting...")
+ << ")" << endl << dec
+ << " Tx count: " << data.devices[i].tx_count << endl
+ << " Rx count: " << data.devices[i].rx_count;
+ }
+ cout << endl;
+ }
+}
+
+/****************************************************************************/
+
void Master::listPdos(int slavePosition)
{
if (slavePosition == -1) {
@@ -444,15 +496,21 @@
unsigned int Master::slaveCount()
{
- int ret;
-
- if ((ret = ioctl(fd, EC_IOCTL_SLAVE_COUNT, 0)) < 0) {
- stringstream err;
- err << "Failed to get number of slaves: " << strerror(errno);
- throw MasterException(err.str());
- }
-
- return ret;
+ ec_ioctl_master_t data;
+
+ getMaster(&data);
+ return data.slave_count;
+}
+
+/****************************************************************************/
+
+void Master::getMaster(ec_ioctl_master_t *data)
+{
+ if (ioctl(fd, EC_IOCTL_MASTER, data) < 0) {
+ stringstream err;
+ err << "Failed to get master information: " << strerror(errno);
+ throw MasterException(err.str());
+ }
}
/****************************************************************************/
--- a/tools/Master.h Thu Jun 05 14:33:36 2008 +0000
+++ b/tools/Master.h Thu Jun 05 15:39:15 2008 +0000
@@ -46,6 +46,7 @@
void setDebug(const vector<string> &);
void showDomains(int);
void listSlaves();
+ void showMaster();
void listPdos(int);
void generateXml(int);
@@ -56,6 +57,7 @@
void generateSlaveXml(uint16_t);
unsigned int domainCount();
unsigned int slaveCount();
+ void getMaster(ec_ioctl_master_t *);
void slaveSyncs(uint16_t);
void getDomain(ec_ioctl_domain_t *, unsigned int);
void getFmmu(ec_ioctl_domain_fmmu_t *, unsigned int, unsigned int);
--- a/tools/main.cpp Thu Jun 05 14:33:36 2008 +0000
+++ b/tools/main.cpp Thu Jun 05 15:39:15 2008 +0000
@@ -37,6 +37,7 @@
<< " debug Set the master debug level." << endl
<< " domain Show domain information." << endl
<< " list (ls, slaves) List all slaves (former 'lsec')." << endl
+ << " master Show master information." << endl
<< " pdos List Pdo mapping of given slaves." << endl
<< " xml Generate slave information xml." << endl
<< "Global options:" << endl
@@ -157,6 +158,8 @@
master.showDomains(domainIndex);
} else if (command == "list" || command == "ls" || command == "slaves") {
master.listSlaves();
+ } else if (command == "master") {
+ master.showMaster();
} else if (command == "pdos") {
master.listPdos(slavePosition);
} else if (command == "xml") {