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 |