master/fsm.c
changeset 310 b7e7709fd40e
parent 309 42e69cf31495
child 311 197489292da8
equal deleted inserted replaced
309:42e69cf31495 310:b7e7709fd40e
    53 void ec_fsm_master_configure_slave(ec_fsm_t *);
    53 void ec_fsm_master_configure_slave(ec_fsm_t *);
    54 void ec_fsm_master_scan_slaves(ec_fsm_t *);
    54 void ec_fsm_master_scan_slaves(ec_fsm_t *);
    55 void ec_fsm_master_write_eeprom(ec_fsm_t *);
    55 void ec_fsm_master_write_eeprom(ec_fsm_t *);
    56 
    56 
    57 void ec_fsm_slavescan_start(ec_fsm_t *);
    57 void ec_fsm_slavescan_start(ec_fsm_t *);
       
    58 void ec_fsm_slavescan_address(ec_fsm_t *);
    58 void ec_fsm_slavescan_state(ec_fsm_t *);
    59 void ec_fsm_slavescan_state(ec_fsm_t *);
    59 void ec_fsm_slavescan_base(ec_fsm_t *);
    60 void ec_fsm_slavescan_base(ec_fsm_t *);
    60 void ec_fsm_slavescan_datalink(ec_fsm_t *);
    61 void ec_fsm_slavescan_datalink(ec_fsm_t *);
    61 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
    62 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
    62 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
    63 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
    63 void ec_fsm_slavescan_eeprom_data2(ec_fsm_t *);
       
    64 void ec_fsm_slavescan_end(ec_fsm_t *);
    64 void ec_fsm_slavescan_end(ec_fsm_t *);
    65 
    65 
    66 void ec_fsm_slaveconf_init(ec_fsm_t *);
    66 void ec_fsm_slaveconf_init(ec_fsm_t *);
    67 void ec_fsm_slaveconf_sync(ec_fsm_t *);
    67 void ec_fsm_slaveconf_sync(ec_fsm_t *);
    68 void ec_fsm_slaveconf_preop(ec_fsm_t *);
    68 void ec_fsm_slaveconf_preop(ec_fsm_t *);
   763 
   763 
   764     // write station address
   764     // write station address
   765     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
   765     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
   766     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
   766     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
   767     ec_master_queue_datagram(fsm->master, datagram);
   767     ec_master_queue_datagram(fsm->master, datagram);
   768     fsm->slave_state = ec_fsm_slavescan_state;
   768     fsm->slave_state = ec_fsm_slavescan_address;
   769 }
   769 }
   770 
   770 
   771 /*****************************************************************************/
   771 /*****************************************************************************/
   772 
   772 
   773 /**
   773 /**
   774    Slave state: READ_STATUS.
   774    Slave state: ADDRESS.
   775 */
   775 */
   776 
   776 
   777 void ec_fsm_slavescan_state(ec_fsm_t *fsm /**< finite state machine */)
   777 void ec_fsm_slavescan_address(ec_fsm_t *fsm /**< finite state machine */)
   778 {
   778 {
   779     ec_datagram_t *datagram = &fsm->datagram;
   779     ec_datagram_t *datagram = &fsm->datagram;
   780 
   780 
   781     if (datagram->state != EC_CMD_RECEIVED || datagram->working_counter != 1) {
   781     if (datagram->state != EC_CMD_RECEIVED || datagram->working_counter != 1) {
   782         fsm->slave->error_flag = 1;
   782         fsm->slave->error_flag = 1;
   787     }
   787     }
   788 
   788 
   789     // Read AL state
   789     // Read AL state
   790     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0130, 2);
   790     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0130, 2);
   791     ec_master_queue_datagram(fsm->master, datagram);
   791     ec_master_queue_datagram(fsm->master, datagram);
   792     fsm->slave_state = ec_fsm_slavescan_base;
   792     fsm->slave_state = ec_fsm_slavescan_state;
   793 }
   793 }
   794 
   794 
   795 /*****************************************************************************/
   795 /*****************************************************************************/
   796 
   796 
   797 /**
   797 /**
   798    Slave state: READ_BASE.
   798    Slave state: STATE.
   799 */
   799 */
   800 
   800 
   801 void ec_fsm_slavescan_base(ec_fsm_t *fsm /**< finite state machine */)
   801 void ec_fsm_slavescan_state(ec_fsm_t *fsm /**< finite state machine */)
   802 {
   802 {
   803     ec_datagram_t *datagram = &fsm->datagram;
   803     ec_datagram_t *datagram = &fsm->datagram;
   804     ec_slave_t *slave = fsm->slave;
   804     ec_slave_t *slave = fsm->slave;
   805 
   805 
   806     if (datagram->state != EC_CMD_RECEIVED || datagram->working_counter != 1) {
   806     if (datagram->state != EC_CMD_RECEIVED || datagram->working_counter != 1) {
   819     }
   819     }
   820 
   820 
   821     // read base data
   821     // read base data
   822     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
   822     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
   823     ec_master_queue_datagram(fsm->master, datagram);
   823     ec_master_queue_datagram(fsm->master, datagram);
   824     fsm->slave_state = ec_fsm_slavescan_datalink;
   824     fsm->slave_state = ec_fsm_slavescan_base;
   825 }
   825 }
   826 
   826 
   827 /*****************************************************************************/
   827 /*****************************************************************************/
   828 
   828 
   829 /**
   829 /**
   830    Slave state: READ_DL.
   830    Slave state: BASE.
   831 */
   831 */
   832 
   832 
   833 void ec_fsm_slavescan_datalink(ec_fsm_t *fsm /**< finite state machine */)
   833 void ec_fsm_slavescan_base(ec_fsm_t *fsm /**< finite state machine */)
   834 {
   834 {
   835     ec_datagram_t *datagram = &fsm->datagram;
   835     ec_datagram_t *datagram = &fsm->datagram;
   836     ec_slave_t *slave = fsm->slave;
   836     ec_slave_t *slave = fsm->slave;
   837 
   837 
   838     if (datagram->state != EC_CMD_RECEIVED || datagram->working_counter != 1) {
   838     if (datagram->state != EC_CMD_RECEIVED || datagram->working_counter != 1) {
   853         slave->base_fmmu_count = EC_MAX_FMMUS;
   853         slave->base_fmmu_count = EC_MAX_FMMUS;
   854 
   854 
   855     // read data link status
   855     // read data link status
   856     ec_datagram_nprd(datagram, slave->station_address, 0x0110, 2);
   856     ec_datagram_nprd(datagram, slave->station_address, 0x0110, 2);
   857     ec_master_queue_datagram(slave->master, datagram);
   857     ec_master_queue_datagram(slave->master, datagram);
   858     fsm->slave_state = ec_fsm_slavescan_eeprom_size;
   858     fsm->slave_state = ec_fsm_slavescan_datalink;
   859 }
   859 }
   860 
   860 
   861 /*****************************************************************************/
   861 /*****************************************************************************/
   862 
   862 
   863 /**
   863 /**
   864    Slave state: EEPROM_SIZE.
   864    Slave state: DATALINK.
   865    Read the actual size of the EEPROM to allocate the EEPROM image.
   865 */
   866 */
   866 
   867 
   867 void ec_fsm_slavescan_datalink(ec_fsm_t *fsm /**< finite state machine */)
   868 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *fsm /**< finite state machine */)
       
   869 {
   868 {
   870     ec_datagram_t *datagram = &fsm->datagram;
   869     ec_datagram_t *datagram = &fsm->datagram;
   871     ec_slave_t *slave = fsm->slave;
   870     ec_slave_t *slave = fsm->slave;
   872     uint16_t dl_status;
   871     uint16_t dl_status;
   873     unsigned int i;
   872     unsigned int i;
   890     // Start fetching EEPROM size
   889     // Start fetching EEPROM size
   891 
   890 
   892     fsm->sii_offset = 0x0040; // first category header
   891     fsm->sii_offset = 0x0040; // first category header
   893     fsm->sii_mode = 1;
   892     fsm->sii_mode = 1;
   894     fsm->sii_state = ec_fsm_sii_start_reading;
   893     fsm->sii_state = ec_fsm_sii_start_reading;
   895     fsm->slave_state = ec_fsm_slavescan_eeprom_data;
   894     fsm->slave_state = ec_fsm_slavescan_eeprom_size;
   896     fsm->slave_state(fsm); // execute state immediately
   895     fsm->slave_state(fsm); // execute state immediately
   897 }
   896 }
   898 
   897 
   899 /*****************************************************************************/
   898 /*****************************************************************************/
   900 
   899 
   901 /**
   900 /**
   902    Slave state: FETCH_EEPROM.
   901    Slave state: EEPROM_SIZE.
   903 */
   902 */
   904 
   903 
   905 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *fsm /**< finite state machine */)
   904 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *fsm /**< finite state machine */)
   906 {
   905 {
   907     ec_slave_t *slave = fsm->slave;
   906     ec_slave_t *slave = fsm->slave;
   908     uint16_t cat_type, cat_size;
   907     uint16_t cat_type, cat_size;
   909 
   908 
   910     // execute SII state machine
   909     // execute SII state machine
   950     // Start fetching EEPROM contents
   949     // Start fetching EEPROM contents
   951 
   950 
   952     fsm->sii_offset = 0x0000;
   951     fsm->sii_offset = 0x0000;
   953     fsm->sii_mode = 1;
   952     fsm->sii_mode = 1;
   954     fsm->sii_state = ec_fsm_sii_start_reading;
   953     fsm->sii_state = ec_fsm_sii_start_reading;
   955     fsm->slave_state = ec_fsm_slavescan_eeprom_data2;
   954     fsm->slave_state = ec_fsm_slavescan_eeprom_data;
   956     fsm->slave_state(fsm); // execute state immediately
   955     fsm->slave_state(fsm); // execute state immediately
   957 }
   956 }
   958 
   957 
   959 /*****************************************************************************/
   958 /*****************************************************************************/
   960 
   959 
   961 /**
   960 /**
   962    Slave state: FETCH_EEPROM2.
   961    Slave state: EEPROM_DATA.
   963 */
   962 */
   964 
   963 
   965 void ec_fsm_slavescan_eeprom_data2(ec_fsm_t *fsm /**< finite state machine */)
   964 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *fsm /**< finite state machine */)
   966 {
   965 {
   967     ec_slave_t *slave = fsm->slave;
   966     ec_slave_t *slave = fsm->slave;
   968     uint16_t *cat_word, cat_type, cat_size;
   967     uint16_t *cat_word, cat_type, cat_size;
   969 
   968 
   970     // execute SII state machine
   969     // execute SII state machine
  1057                         cat_type, slave->ring_position);
  1056                         cat_type, slave->ring_position);
  1058         }
  1057         }
  1059 
  1058 
  1060         cat_word += cat_size + 2;
  1059         cat_word += cat_size + 2;
  1061     }
  1060     }
       
  1061 
       
  1062     fsm->slave_state = ec_fsm_slavescan_end;
  1062 
  1063 
  1063 end:
  1064 end:
  1064     fsm->slave->error_flag = 1;
  1065     fsm->slave->error_flag = 1;
  1065     fsm->slave_state = ec_fsm_slavescan_end;
  1066     fsm->slave_state = ec_fsm_slavescan_end;
  1066 }
  1067 }