win32/firm_update/firm_update.c
Go to the documentation of this file.
1 
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <sys/time.h>
19 #include <unistd.h>
20 
21 #include "ethercattype.h"
22 #include "nicdrv.h"
23 #include "ethercatbase.h"
24 #include "ethercatmain.h"
25 #include "ethercatcoe.h"
26 #include "ethercatfoe.h"
27 #include "ethercatconfig.h"
28 #include "ethercatprint.h"
29 
30 #define FWBUFSIZE (8 * 1024 * 1024)
31 
35 char filename[256];
36 char filebuffer[FWBUFSIZE]; // 8MB buffer
38 int j;
40 
41 int input_bin(char *fname, int *length)
42 {
43  FILE *fp;
44 
45  int cc = 0, c;
46 
47  fp = fopen(fname, "rb");
48  if(fp == NULL)
49  return 0;
50  while (((c = fgetc(fp)) != EOF) && (cc < FWBUFSIZE))
51  filebuffer[cc++] = (uint8)c;
52  *length = cc;
53  fclose(fp);
54  return 1;
55 }
56 
57 
58 void boottest(char *ifname, uint16 slave, char *filename)
59 {
60  printf("Starting firmware update example\n");
61 
62  /* initialise SOEM, bind socket to ifname */
63  if (ec_init(ifname))
64  {
65  printf("ec_init on %s succeeded.\n",ifname);
66  /* find and auto-config slaves */
67 
68 
69  if ( ec_config_init(FALSE) > 0 )
70  {
71  printf("%d slaves found and configured.\n",ec_slavecount);
72 
73  printf("Request init state for slave %d\n", slave);
75  ec_writestate(slave);
76 
77  /* wait for slave to reach INIT state */
79  printf("Slave %d state to INIT.\n", slave);
80 
81  /* read BOOT mailbox data, master -> slave */
83  ec_slave[slave].SM[0].StartAddr = (uint16)LO_WORD(data);
84  ec_slave[slave].SM[0].SMlength = (uint16)HI_WORD(data);
85  /* store boot write mailbox address */
87  /* store boot write mailbox size */
89 
90  /* read BOOT mailbox data, slave -> master */
92  ec_slave[slave].SM[1].StartAddr = (uint16)LO_WORD(data);
93  ec_slave[slave].SM[1].SMlength = (uint16)HI_WORD(data);
94  /* store boot read mailbox address */
96  /* store boot read mailbox size */
98 
99  printf(" SM0 A:%4.4x L:%4d F:%8.8x\n", ec_slave[slave].SM[0].StartAddr, ec_slave[slave].SM[0].SMlength,
100  (int)ec_slave[slave].SM[0].SMflags);
101  printf(" SM1 A:%4.4x L:%4d F:%8.8x\n", ec_slave[slave].SM[1].StartAddr, ec_slave[slave].SM[1].SMlength,
102  (int)ec_slave[slave].SM[1].SMflags);
103  /* program SM0 mailbox in for slave */
104  ec_FPWR (ec_slave[slave].configadr, ECT_REG_SM0, sizeof(ec_smt), &ec_slave[slave].SM[0], EC_TIMEOUTRET);
105  /* program SM1 mailbox out for slave */
106  ec_FPWR (ec_slave[slave].configadr, ECT_REG_SM1, sizeof(ec_smt), &ec_slave[slave].SM[1], EC_TIMEOUTRET);
107 
108  printf("Request BOOT state for slave %d\n", slave);
110  ec_writestate(slave);
111 
112  /* wait for slave to reach BOOT state */
114  {
115  printf("Slave %d state to BOOT.\n", slave);
116 
117  if (input_bin(filename, &filesize))
118  {
119  printf("File read OK, %d bytes.\n",filesize);
120  printf("FoE write....");
121  j = ec_FOEwrite(slave, filename, 0, filesize , &filebuffer, EC_TIMEOUTSTATE);
122  printf("result %d.\n",j);
123  printf("Request init state for slave %d\n", slave);
125  ec_writestate(slave);
126  }
127  else
128  printf("File not read OK.\n");
129  }
130 
131  }
132  else
133  {
134  printf("No slaves found!\n");
135  }
136  printf("End firmware update example, close socket\n");
137  /* stop SOEM, close socket */
138  ec_close();
139  }
140  else
141  {
142  printf("No socket connection on %s\nExcecute as root\n",ifname);
143  }
144 }
145 
146 int main(int argc, char *argv[])
147 {
148  printf("SOEM (Simple Open EtherCAT Master)\nFirmware update example\n");
149 
150  if (argc > 3)
151  {
152  argslave = atoi(argv[2]);
153  boottest(argv[1], argslave, argv[3]);
154  }
155  else
156  {
157  printf("Usage: firm_update ifname1 slave fname\n");
158  printf("ifname = eth0 for example\n");
159  printf("slave = slave number in EtherCAT order 1..n\n");
160  printf("fname = binary file to store in slave\n");
161  printf("CAUTION! Using the wrong file can result in a bricked slave!\n");
162  }
163 
164  printf("End program\n");
165  return (0);
166 }
uint16 mbx_rl
Definition: ethercatmain.h:192
int ec_FOEwrite(uint16 slave, char *filename, uint32 password, int psize, void *p, int timeout)
Definition: ethercatfoe.c:395
#define EC_TIMEOUTSTATE
Definition: ethercattype.h:102
PACKED_END ec_slavet ec_slave[EC_MAXSLAVE]
Definition: ethercatmain.c:104
uint8_t uint8
Definition: osal.h:33
uint16 mbx_l
Definition: ethercatmain.h:188
ec_smt SM[EC_MAXSM]
Definition: ethercatmain.h:174
uint16_t uint16
Definition: osal.h:34
int main(int argc, char *argv[])
General typedefs and defines for EtherCAT.
Headerfile for ethercatcoe.c.
uint32 ec_readeeprom(uint16 slave, uint16 eeproma, int timeout)
char filename[256]
char filebuffer[FWBUFSIZE]
uint16 mbx_ro
Definition: ethercatmain.h:194
int ec_init(char *ifname)
Headerfile for ethercatfoe.c.
int slave
Definition: aliastool.c:51
#define FALSE
Definition: osal.h:29
#define EC_TIMEOUTEEP
Definition: ethercattype.h:96
#define HI_WORD(l)
Definition: ethercattype.h:534
#define EC_TIMEOUTRET
Definition: ethercattype.h:90
#define LO_WORD(l)
Definition: ethercattype.h:532
int ec_writestate(uint16 slave)
int ec_FPWR(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
Definition: ethercatbase.c:618
Headerfile for ethercatbase.c.
uint16 mbx_wo
Definition: ethercatmain.h:190
Headerfile for ethercatmain.c.
uint32_t uint32
Definition: osal.h:35
int input_bin(char *fname, int *length)
uint16 state
Definition: ethercatmain.h:140
void ec_close(void)
uint16 ec_statecheck(uint16 slave, uint16 reqstate, int timeout)
#define FWBUFSIZE
int ec_slavecount
Definition: ethercatmain.c:106
Headerfile for ethercatconfig.c.
PACKED_END PACKED_BEGIN struct PACKED ec_smt
void boottest(char *ifname, uint16 slave, char *filename)
int ec_config_init(uint8 usetable)
Headerfile for ethercatprint.c.


soem
Author(s): Arthur Ketels and M.J.G. van den Molengraft
autogenerated on Sat Jun 8 2019 18:02:17