加入 写 SN
This commit is contained in:
parent
be172749b2
commit
25fd9f81fb
|
@ -5,6 +5,7 @@
|
||||||
"struct_timeval.h": "c",
|
"struct_timeval.h": "c",
|
||||||
"features.h": "c",
|
"features.h": "c",
|
||||||
"random": "c",
|
"random": "c",
|
||||||
"logn.h": "c"
|
"logn.h": "c",
|
||||||
|
"timesize.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -31,7 +31,8 @@
|
||||||
#define MODE_WRITEBIN 3
|
#define MODE_WRITEBIN 3
|
||||||
#define MODE_WRITEINTEL 4
|
#define MODE_WRITEINTEL 4
|
||||||
#define MODE_WRITEALIAS 5
|
#define MODE_WRITEALIAS 5
|
||||||
#define MODE_INFO 6
|
#define MODE_WRITESN 6
|
||||||
|
#define MODE_INFO 7
|
||||||
|
|
||||||
#define MAXSLENGTH 256
|
#define MAXSLENGTH 256
|
||||||
|
|
||||||
|
@ -40,7 +41,8 @@ uint8 ob;
|
||||||
uint16 ow;
|
uint16 ow;
|
||||||
int os;
|
int os;
|
||||||
int slave;
|
int slave;
|
||||||
int alias;
|
uint16 alias;
|
||||||
|
uint32 serial_no;
|
||||||
ec_timet tstart, tend, tdif;
|
ec_timet tstart, tend, tdif;
|
||||||
int wkc;
|
int wkc;
|
||||||
int mode;
|
int mode;
|
||||||
|
@ -292,13 +294,13 @@ int eeprom_write(int slave, int start, int length)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int eeprom_writealias(int slave, int alias, uint16 crc)
|
int eeprom_writealias(int slave, uint16 alias, uint16 crc)
|
||||||
{
|
{
|
||||||
uint16 aiadr;
|
uint16 aiadr;
|
||||||
uint8 eepctl;
|
uint8 eepctl;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((ec_slavecount >= slave) && (slave > 0) && (alias <= 0xffff))
|
if ((ec_slavecount >= slave) && (slave > 0))
|
||||||
{
|
{
|
||||||
aiadr = 1 - slave;
|
aiadr = 1 - slave;
|
||||||
eepctl = 2;
|
eepctl = 2;
|
||||||
|
@ -318,7 +320,34 @@ int eeprom_writealias(int slave, int alias, uint16 crc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void eepromtool(char *ifname, int slave, int mode, char *fname)
|
int eeprom_writesn(int slave, uint32_t sn)
|
||||||
|
{
|
||||||
|
uint16 aiadr;
|
||||||
|
uint8 eepctl;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((slave > ec_slavecount) || (slave <= 0))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
aiadr = 1 - slave;
|
||||||
|
eepctl = 2;
|
||||||
|
ec_APWR(aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl,
|
||||||
|
EC_TIMEOUTRET); /* force Eeprom from PDI */
|
||||||
|
eepctl = 0;
|
||||||
|
ec_APWR(aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl,
|
||||||
|
EC_TIMEOUTRET); /* set Eeprom to master */
|
||||||
|
|
||||||
|
ret = ec_writeeepromAP(aiadr, 0x0E, (uint16)(sn & 0xffff), EC_TIMEOUTEEP);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
ret = ec_writeeepromAP(aiadr, 0x0F, (uint16)(sn >> 16), EC_TIMEOUTEEP);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
{
|
{
|
||||||
int w, rc = 0, estart, esize;
|
int w, rc = 0, estart, esize;
|
||||||
uint16 *wbuf;
|
uint16 *wbuf;
|
||||||
|
@ -345,21 +374,25 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
|
|
||||||
wbuf = (uint16 *)&ebuf[0];
|
wbuf = (uint16 *)&ebuf[0];
|
||||||
printf("Slave %d data\n", slave);
|
printf("Slave %d data\n", slave);
|
||||||
printf(" PDI Control : %4.4X\n", *(wbuf + 0x00));
|
printf(" PDI Control : 0x%4.4X(%u)\n", *(wbuf + 0x00), *(wbuf + 0x00));
|
||||||
printf(" PDI Config : %4.4X\n", *(wbuf + 0x01));
|
printf(" PDI Config : 0x%4.4X(%u)\n", *(wbuf + 0x01), *(wbuf + 0x01));
|
||||||
printf(" Config Alias : %4.4X\n", *(wbuf + 0x04));
|
printf(" Config Alias : 0x%4.4X(%u)\n", *(wbuf + 0x04), *(wbuf + 0x04));
|
||||||
printf(" Checksum : %4.4X\n", *(wbuf + 0x07));
|
printf(" Checksum : 0x%4.4X\n", *(wbuf + 0x07));
|
||||||
printf(" calculated : %4.4X\n", SIIcrc(&ebuf[0]));
|
printf(" calculated : 0x%4.4X\n", SIIcrc(&ebuf[0]));
|
||||||
printf(" Vendor ID : %8.8X\n", *(uint32 *)(wbuf + 0x08));
|
printf(" Vendor ID : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x08),
|
||||||
printf(" Product Code : %8.8X\n", *(uint32 *)(wbuf + 0x0A));
|
*(uint32 *)(wbuf + 0x08));
|
||||||
printf(" Revision Number : %8.8X\n", *(uint32 *)(wbuf + 0x0C));
|
printf(" Product Code : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x0A),
|
||||||
printf(" Serial Number : %8.8X\n", *(uint32 *)(wbuf + 0x0E));
|
*(uint32 *)(wbuf + 0x0A));
|
||||||
printf(" Mailbox Protocol : %4.4X\n", *(wbuf + 0x1C));
|
printf(" Revision Number : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x0C),
|
||||||
|
*(uint32 *)(wbuf + 0x0C));
|
||||||
|
printf(" Serial Number : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x0E),
|
||||||
|
*(uint32 *)(wbuf + 0x0E));
|
||||||
|
printf(" Mailbox Protocol : 0x%4.4X\n", *(wbuf + 0x1C));
|
||||||
esize = (*(wbuf + 0x3E) + 1) * 128;
|
esize = (*(wbuf + 0x3E) + 1) * 128;
|
||||||
if (esize > MAXBUF)
|
if (esize > MAXBUF)
|
||||||
esize = MAXBUF;
|
esize = MAXBUF;
|
||||||
printf(" Size : %4.4X = %d bytes\n", *(wbuf + 0x3E), esize);
|
printf(" Size : 0x%4.4X = %d bytes\n", *(wbuf + 0x3E), esize);
|
||||||
printf(" Version : %4.4X\n", *(wbuf + 0x3F));
|
printf(" Version : 0x%4.4X(%u)\n", *(wbuf + 0x3F), *(wbuf + 0x3F));
|
||||||
}
|
}
|
||||||
if ((mode == MODE_READBIN) || (mode == MODE_READINTEL))
|
if ((mode == MODE_READBIN) || (mode == MODE_READINTEL))
|
||||||
{
|
{
|
||||||
|
@ -373,7 +406,7 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
if (mode == MODE_READBIN)
|
if (mode == MODE_READBIN)
|
||||||
output_bin(fname, esize);
|
output_bin(fname, esize);
|
||||||
|
|
||||||
printf("\nTotal EEPROM read time :%ldms\n",
|
printf("\nTotal EEPROM read time: %ldms\n",
|
||||||
(tdif.usec + (tdif.sec * 1000000L)) / 1000);
|
(tdif.usec + (tdif.sec * 1000000L)) / 1000);
|
||||||
}
|
}
|
||||||
if ((mode == MODE_WRITEBIN) || (mode == MODE_WRITEINTEL))
|
if ((mode == MODE_WRITEBIN) || (mode == MODE_WRITEINTEL))
|
||||||
|
@ -388,10 +421,14 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
{
|
{
|
||||||
wbuf = (uint16 *)&ebuf[0];
|
wbuf = (uint16 *)&ebuf[0];
|
||||||
printf("Slave %d\n", slave);
|
printf("Slave %d\n", slave);
|
||||||
printf(" Vendor ID : %8.8X\n", *(uint32 *)(wbuf + 0x08));
|
printf(" Vendor ID : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x08),
|
||||||
printf(" Product Code : %8.8X\n", *(uint32 *)(wbuf + 0x0A));
|
*(uint32 *)(wbuf + 0x08));
|
||||||
printf(" Revision Number : %8.8X\n", *(uint32 *)(wbuf + 0x0C));
|
printf(" Product Code : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x0A),
|
||||||
printf(" Serial Number : %8.8X\n", *(uint32 *)(wbuf + 0x0E));
|
*(uint32 *)(wbuf + 0x0A));
|
||||||
|
printf(" Revision Number : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x0C),
|
||||||
|
*(uint32 *)(wbuf + 0x0C));
|
||||||
|
printf(" Serial Number : 0x%8.8X(%u)\n", *(uint32 *)(wbuf + 0x0E),
|
||||||
|
*(uint32 *)(wbuf + 0x0E));
|
||||||
|
|
||||||
printf("Busy");
|
printf("Busy");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
@ -412,9 +449,12 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
{
|
{
|
||||||
wbuf = (uint16 *)&ebuf[0];
|
wbuf = (uint16 *)&ebuf[0];
|
||||||
*(wbuf + 0x04) = alias;
|
*(wbuf + 0x04) = alias;
|
||||||
if (eeprom_writealias(slave, alias, SIIcrc(&ebuf[0])))
|
|
||||||
|
rc = eeprom_writealias(slave, alias, SIIcrc(&ebuf[0]));
|
||||||
|
if (rc)
|
||||||
{
|
{
|
||||||
printf("Alias %4.4X written successfully to slave %d\n", alias, slave);
|
printf("Alias %d (HEX: %4.4X) written successfully to slave %d\n",
|
||||||
|
alias, alias, slave);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -426,6 +466,19 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
printf("Could not read slave EEPROM");
|
printf("Could not read slave EEPROM");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (mode == MODE_WRITESN)
|
||||||
|
{
|
||||||
|
rc = eeprom_writesn(slave, serial_no);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
printf("SerialNo %u (HEX: %8.8X) written successfully to slave %d\n",
|
||||||
|
serial_no, serial_no, slave);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("SerialNo not written\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -444,10 +497,12 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
|
||||||
{
|
{
|
||||||
printf("No socket connection on %s\nExcecute as root\n", ifname);
|
printf("No socket connection on %s\nExcecute as root\n", ifname);
|
||||||
}
|
}
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
int rc = 1;
|
||||||
printf("SOEM (Simple Open EtherCAT Master)\nEEPROM tool\n");
|
printf("SOEM (Simple Open EtherCAT Master)\nEEPROM tool\n");
|
||||||
|
|
||||||
mode = MODE_NONE;
|
mode = MODE_NONE;
|
||||||
|
@ -466,28 +521,47 @@ int main(int argc, char *argv[])
|
||||||
mode = MODE_WRITEBIN;
|
mode = MODE_WRITEBIN;
|
||||||
if ((strncmp(argv[3], "-wi", sizeof("-wi")) == 0))
|
if ((strncmp(argv[3], "-wi", sizeof("-wi")) == 0))
|
||||||
mode = MODE_WRITEINTEL;
|
mode = MODE_WRITEINTEL;
|
||||||
if ((strncmp(argv[3], "-walias", sizeof("-walias")) == 0))
|
if ((strncmp(argv[3], "-wa", sizeof("-wa")) == 0))
|
||||||
{
|
{
|
||||||
mode = MODE_WRITEALIAS;
|
mode = MODE_WRITEALIAS;
|
||||||
alias = atoi(argv[4]);
|
alias = (uint16)strtoul(argv[4], NULL, 10);
|
||||||
|
}
|
||||||
|
if ((strncmp(argv[3], "-wah", sizeof("-wah")) == 0))
|
||||||
|
{
|
||||||
|
mode = MODE_WRITEALIAS;
|
||||||
|
alias = (uint16)strtoul(argv[4], NULL, 16);
|
||||||
|
}
|
||||||
|
if ((strncmp(argv[3], "-wsn", sizeof("-wsn")) == 0))
|
||||||
|
{
|
||||||
|
mode = MODE_WRITESN;
|
||||||
|
serial_no = strtoul(argv[4], NULL, 10);
|
||||||
|
}
|
||||||
|
if ((strncmp(argv[3], "-wsnh", sizeof("-wsnh")) == 0))
|
||||||
|
{
|
||||||
|
mode = MODE_WRITESN;
|
||||||
|
serial_no = strtoul(argv[4], NULL, 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* start tool */
|
/* start tool */
|
||||||
eepromtool(argv[1], slave, mode, argv[4]);
|
rc = !eepromtool(argv[1], slave, mode, argv[4]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ec_adaptert *adapter = NULL;
|
ec_adaptert *adapter = NULL;
|
||||||
|
|
||||||
printf("Usage: eepromtool ifname slave OPTION fname|alias\n");
|
printf("Usage: eepromtool ifname slave OPTION fname|alias|serial_no\n");
|
||||||
printf("ifname = eth0 for example\n");
|
printf("ifname = name of the network interface, e.g., eth0\n");
|
||||||
printf("slave = slave number in EtherCAT order 1..n\n");
|
printf("slave = slave number in EtherCAT order (1..n)\n");
|
||||||
printf(" -i display EEPROM information\n");
|
printf("Options:\n");
|
||||||
printf(" -walias write slave alias\n");
|
printf(" -i Display EEPROM information\n");
|
||||||
printf(" -r read EEPROM, output binary format\n");
|
printf(" -wa Write slave alias in decimal format\n");
|
||||||
printf(" -ri read EEPROM, output Intel Hex format\n");
|
printf(" -wah Write slave alias in hexadecimal format\n");
|
||||||
printf(" -w write EEPROM, input binary format\n");
|
printf(" -wsn Write serial number in decimal format\n");
|
||||||
printf(" -wi write EEPROM, input Intel Hex format\n");
|
printf(" -wsnh Write serial number in hexadecimal format\n");
|
||||||
|
printf(" -r Read EEPROM and output in binary format\n");
|
||||||
|
printf(" -ri Read EEPROM and output in Intel Hex format\n");
|
||||||
|
printf(" -w Write EEPROM using binary input format\n");
|
||||||
|
printf(" -wi Write EEPROM using Intel Hex input format\n");
|
||||||
|
|
||||||
printf("\nAvailable adapters:\n");
|
printf("\nAvailable adapters:\n");
|
||||||
adapter = ec_find_adapters();
|
adapter = ec_find_adapters();
|
||||||
|
@ -501,5 +575,5 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
printf("End program\n");
|
printf("End program\n");
|
||||||
|
|
||||||
return (0);
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue