Implemented domain command.

This commit is contained in:
Florian Pose 2008-06-04 10:13:07 +00:00
parent 1ecd525663
commit ea384440f4
5 changed files with 150 additions and 4 deletions

View File

@ -347,6 +347,38 @@ long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
break;
}
case EC_IOCTL_DOMAIN_COUNT:
retval = ec_master_domain_count(master);
break;
case EC_IOCTL_DOMAIN:
{
ec_ioctl_domain_t data;
const ec_domain_t *domain;
if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
retval = -EFAULT;
break;
}
if (!(domain = ec_master_find_domain(master, data.index))) {
EC_ERR("Domain %u does not exist!\n", data.index);
retval = -EINVAL;
break;
}
data.data_size = domain->data_size;
data.logical_base_address = domain->logical_base_address;
data.working_counter = domain->working_counter;
data.expected_working_counter = domain->expected_working_counter;
if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
retval = -EFAULT;
break;
}
break;
}
default:
retval = -ENOIOCTLCMD;
}

View File

@ -49,6 +49,8 @@ enum {
EC_IOCTL_SYNC,
EC_IOCTL_PDO,
EC_IOCTL_PDO_ENTRY,
EC_IOCTL_DOMAIN_COUNT,
EC_IOCTL_DOMAIN
};
/*****************************************************************************/
@ -123,4 +125,17 @@ typedef struct {
/*****************************************************************************/
typedef struct {
// inputs
unsigned int index;
// outputs
unsigned int data_size;
uint32_t logical_base_address;
uint16_t working_counter;
uint16_t expected_working_counter;
} ec_ioctl_domain_t;
/*****************************************************************************/
#endif

View File

@ -62,6 +62,21 @@ void Master::close()
/****************************************************************************/
void Master::showDomains(int domainIndex)
{
if (domainIndex == -1) {
unsigned int numDomains = domainCount(), i;
for (i = 0; i < numDomains; i++) {
showDomain(i);
}
} else {
showDomain(domainIndex);
}
}
/****************************************************************************/
void Master::listSlaves()
{
unsigned int numSlaves = slaveCount(), i;
@ -127,6 +142,29 @@ void Master::generateXml(int slavePosition)
/****************************************************************************/
void Master::showDomain(unsigned int domainIndex)
{
ec_ioctl_domain_t data;
getDomain(&data, domainIndex);
unsigned int data_size;
uint32_t logical_base_address;
uint16_t working_counter;
uint16_t expected_working_counter;
cout << "Domain" << domainIndex << ":"
<< " LogBaseAddr 0x"
<< hex << setfill('0') << setw(8) << data.logical_base_address
<< ", Size " << dec << data.data_size
<< ", WorkingCounter "
<< dec << data.working_counter
<< " of " << data.expected_working_counter
<< endl;
}
/****************************************************************************/
void Master::listSlavePdos(uint16_t slavePosition, bool printSlave)
{
ec_ioctl_slave_t slave;
@ -275,13 +313,28 @@ void Master::generateSlaveXml(uint16_t slavePosition)
/****************************************************************************/
unsigned int Master::domainCount()
{
int ret;
if ((ret = ioctl(fd, EC_IOCTL_DOMAIN_COUNT, 0)) < 0) {
stringstream err;
err << "Failed to get number of domains: " << strerror(errno);
throw MasterException(err.str());
}
return ret;
}
/****************************************************************************/
unsigned int Master::slaveCount()
{
int ret;
if ((ret = ioctl(fd, EC_IOCTL_SLAVE_COUNT, 0)) < 0) {
stringstream err;
err << "Failed to get slave: " << strerror(errno);
err << "Failed to get number of slaves: " << strerror(errno);
throw MasterException(err.str());
}
@ -290,6 +343,23 @@ unsigned int Master::slaveCount()
/****************************************************************************/
void Master::getDomain(ec_ioctl_domain_t *data, unsigned int index)
{
data->index = index;
if (ioctl(fd, EC_IOCTL_DOMAIN, data)) {
stringstream err;
err << "Failed to get domain: ";
if (errno == EINVAL)
err << "Domain " << index << " does not exist!";
else
err << strerror(errno);
throw MasterException(err.str());
}
}
/****************************************************************************/
void Master::getSlave(ec_ioctl_slave_t *slave, uint16_t slaveIndex)
{
slave->position = slaveIndex;

View File

@ -40,15 +40,19 @@ class Master
void open(unsigned int);
void close();
void showDomains(int);
void listSlaves();
void listPdos(int);
void generateXml(int);
protected:
void showDomain(unsigned int);
void listSlavePdos(uint16_t, bool = false);
void generateSlaveXml(uint16_t);
unsigned int domainCount();
unsigned int slaveCount();
void slaveSyncs(uint16_t);
void getDomain(ec_ioctl_domain_t *, unsigned int);
void getSlave(ec_ioctl_slave_t *, uint16_t);
void getSync(ec_ioctl_sync_t *, uint16_t, uint8_t);
void getPdo(ec_ioctl_pdo_t *, uint16_t, uint8_t, uint8_t);

View File

@ -17,9 +17,11 @@ using namespace std;
#define DEFAULT_MASTER 0
#define DEFAULT_COMMAND "slaves"
#define DEFAULT_SLAVEPOSITION -1
#define DEFAULT_DOMAININDEX -1
static unsigned int masterIndex = DEFAULT_MASTER;
static int slavePosition = DEFAULT_SLAVEPOSITION;
static int domainIndex = DEFAULT_DOMAININDEX;
static string command = DEFAULT_COMMAND;
/*****************************************************************************/
@ -29,16 +31,21 @@ void printUsage()
cerr
<< "Usage: ethercat <COMMAND> [OPTIONS]" << endl
<< "Commands:" << endl
<< " domain Show domain information." << endl
<< " list (ls, slaves) List all slaves (former 'lsec')." << endl
<< " pdos List Pdo mapping of given slaves." << endl
<< " xml Generate slave information xml." << endl
<< "Global options:" << endl
<< " --master -m <master> Index of the master to use. Default: "
<< DEFAULT_MASTER << endl
<< " --slave -s <slave> Positive numerical ring position,"
<< " --slave -s <index> Positive numerical ring position,"
<< endl
<< " or 'all' for all slaves. Default: 'all'."
<< endl
<< " --domain -d <index> Positive numerical index,"
<< endl
<< " or 'all' for all domains. Default: "
<< "'all'." << endl
<< " --help -h Show this help." << endl;
}
@ -53,12 +60,13 @@ void getOptions(int argc, char **argv)
//name, has_arg, flag, val
{"master", required_argument, NULL, 'm'},
{"slave", required_argument, NULL, 's'},
{"domain", required_argument, NULL, 'd'},
{"help", no_argument, NULL, 'h'},
{}
};
do {
c = getopt_long(argc, argv, "m:s:h", longOptions, &optionIndex);
c = getopt_long(argc, argv, "m:s:d:h", longOptions, &optionIndex);
switch (c) {
case 'm':
@ -87,6 +95,21 @@ void getOptions(int argc, char **argv)
}
break;
case 'd':
if (!strcmp(optarg, "all")) {
domainIndex = -1;
} else {
number = strtoul(optarg, &remainder, 0);
if (remainder == optarg || *remainder || number < 0) {
cerr << "Invalid domain index "
<< optarg << "!" << endl;
printUsage();
exit(1);
}
domainIndex = number;
}
break;
case 'h':
case '?':
printUsage();
@ -120,7 +143,9 @@ int main(int argc, char **argv)
try {
master.open(masterIndex);
if (command == "list" || command == "ls" || command == "slaves") {
if (command == "domain") {
master.showDomains(domainIndex);
} else if (command == "list" || command == "ls" || command == "slaves") {
master.listSlaves();
} else if (command == "pdos") {
master.listPdos(slavePosition);