Implemented 'data' command.
This commit is contained in:
parent
ea384440f4
commit
c74e50706b
|
|
@ -379,6 +379,37 @@ long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
}
|
||||
|
||||
case EC_IOCTL_DATA:
|
||||
{
|
||||
ec_ioctl_data_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.domain_index))) {
|
||||
EC_ERR("Domain %u does not exist!\n", data.domain_index);
|
||||
retval = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (domain->data_size != data.data_size) {
|
||||
EC_ERR("Data size mismatch %u/%u!\n",
|
||||
data.data_size, domain->data_size);
|
||||
retval = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) data.target, domain->data,
|
||||
domain->data_size)) {
|
||||
retval = -EFAULT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
retval = -ENOIOCTLCMD;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,7 +50,8 @@ enum {
|
|||
EC_IOCTL_PDO,
|
||||
EC_IOCTL_PDO_ENTRY,
|
||||
EC_IOCTL_DOMAIN_COUNT,
|
||||
EC_IOCTL_DOMAIN
|
||||
EC_IOCTL_DOMAIN,
|
||||
EC_IOCTL_DATA
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -138,4 +139,13 @@ typedef struct {
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct {
|
||||
// inputs
|
||||
unsigned int domain_index;
|
||||
unsigned int data_size;
|
||||
unsigned char *target;
|
||||
} ec_ioctl_data_t;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -62,6 +62,21 @@ void Master::close()
|
|||
|
||||
/****************************************************************************/
|
||||
|
||||
void Master::outputData(int domainIndex)
|
||||
{
|
||||
if (domainIndex == -1) {
|
||||
unsigned int numDomains = domainCount(), i;
|
||||
|
||||
for (i = 0; i < numDomains; i++) {
|
||||
outputDomainData(i);
|
||||
}
|
||||
} else {
|
||||
outputDomainData(domainIndex);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void Master::showDomains(int domainIndex)
|
||||
{
|
||||
if (domainIndex == -1) {
|
||||
|
|
@ -142,17 +157,43 @@ void Master::generateXml(int slavePosition)
|
|||
|
||||
/****************************************************************************/
|
||||
|
||||
void Master::outputDomainData(unsigned int domainIndex)
|
||||
{
|
||||
ec_ioctl_domain_t domain;
|
||||
ec_ioctl_data_t data;
|
||||
unsigned char *processData;
|
||||
unsigned int i;
|
||||
|
||||
getDomain(&domain, domainIndex);
|
||||
|
||||
processData = new unsigned char[domain.data_size];
|
||||
|
||||
data.domain_index = domainIndex;
|
||||
data.data_size = domain.data_size;
|
||||
data.target = processData;
|
||||
|
||||
if (ioctl(fd, EC_IOCTL_DATA, &data) < 0) {
|
||||
stringstream err;
|
||||
err << "Failed to get domain data: " << strerror(errno);
|
||||
delete [] processData;
|
||||
throw MasterException(err.str());
|
||||
}
|
||||
|
||||
for (i = 0; i < data.data_size; i++)
|
||||
cout << processData[i];
|
||||
cout.flush();
|
||||
|
||||
delete [] processData;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -40,12 +40,14 @@ class Master
|
|||
void open(unsigned int);
|
||||
void close();
|
||||
|
||||
void outputData(int);
|
||||
void showDomains(int);
|
||||
void listSlaves();
|
||||
void listPdos(int);
|
||||
void generateXml(int);
|
||||
|
||||
protected:
|
||||
void outputDomainData(unsigned int);
|
||||
void showDomain(unsigned int);
|
||||
void listSlavePdos(uint16_t, bool = false);
|
||||
void generateSlaveXml(uint16_t);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ void printUsage()
|
|||
cerr
|
||||
<< "Usage: ethercat <COMMAND> [OPTIONS]" << endl
|
||||
<< "Commands:" << endl
|
||||
<< " data Output binary domain process data." << endl
|
||||
<< " domain Show domain information." << endl
|
||||
<< " list (ls, slaves) List all slaves (former 'lsec')." << endl
|
||||
<< " pdos List Pdo mapping of given slaves." << endl
|
||||
|
|
@ -143,7 +144,9 @@ int main(int argc, char **argv)
|
|||
try {
|
||||
master.open(masterIndex);
|
||||
|
||||
if (command == "domain") {
|
||||
if (command == "data") {
|
||||
master.outputData(domainIndex);
|
||||
} else if (command == "domain") {
|
||||
master.showDomains(domainIndex);
|
||||
} else if (command == "list" || command == "ls" || command == "slaves") {
|
||||
master.listSlaves();
|
||||
|
|
|
|||
Loading…
Reference in New Issue