master/fsm_master.c
changeset 815 002fe9ec778f
parent 814 a51f857b1b2d
child 830 d83d92e1a919
equal deleted inserted replaced
814:a51f857b1b2d 815:002fe9ec778f
   295         }
   295         }
   296     }
   296     }
   297 
   297 
   298     // fetch state from each slave
   298     // fetch state from each slave
   299     fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
   299     fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
   300     ec_datagram_nprd(fsm->datagram, fsm->slave->station_address, 0x0130, 2);
   300     ec_datagram_fprd(fsm->datagram, fsm->slave->station_address, 0x0130, 2);
   301     fsm->retries = EC_FSM_RETRIES;
   301     fsm->retries = EC_FSM_RETRIES;
   302     fsm->state = ec_fsm_master_state_read_states;
   302     fsm->state = ec_fsm_master_state_read_states;
   303 }
   303 }
   304 
   304 
   305 /*****************************************************************************/
   305 /*****************************************************************************/
   345             EC_DBG("Writing EEPROM data to slave %i...\n",
   345             EC_DBG("Writing EEPROM data to slave %i...\n",
   346                     slave->ring_position);
   346                     slave->ring_position);
   347         fsm->eeprom_request = request;
   347         fsm->eeprom_request = request;
   348         fsm->eeprom_index = 0;
   348         fsm->eeprom_index = 0;
   349         ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->word_offset,
   349         ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->word_offset,
   350                 request->data, EC_FSM_SII_NODE);
   350                 request->data, EC_FSM_SII_USE_CONFIGURED_ADDRESS);
   351         fsm->state = ec_fsm_master_state_write_eeprom;
   351         fsm->state = ec_fsm_master_state_write_eeprom;
   352         fsm->state(fsm); // execute immediately
   352         fsm->state(fsm); // execute immediately
   353         return 1;
   353         return 1;
   354     }
   354     }
   355 
   355 
   570     // is there another slave to query?
   570     // is there another slave to query?
   571     if (slave->list.next != &master->slaves) {
   571     if (slave->list.next != &master->slaves) {
   572         // process next slave
   572         // process next slave
   573         fsm->idle = 1;
   573         fsm->idle = 1;
   574         fsm->slave = list_entry(slave->list.next, ec_slave_t, list);
   574         fsm->slave = list_entry(slave->list.next, ec_slave_t, list);
   575         ec_datagram_nprd(fsm->datagram, fsm->slave->station_address,
   575         ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   576                          0x0130, 2);
   576                          0x0130, 2);
   577         fsm->retries = EC_FSM_RETRIES;
   577         fsm->retries = EC_FSM_RETRIES;
   578         fsm->state = ec_fsm_master_state_read_states;
   578         fsm->state = ec_fsm_master_state_read_states;
   579         return;
   579         return;
   580     }
   580     }
   590             // At least one slave is offline. validate!
   590             // At least one slave is offline. validate!
   591             EC_INFO("Validating bus.\n");
   591             EC_INFO("Validating bus.\n");
   592             fsm->idle = 0;
   592             fsm->idle = 0;
   593             fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
   593             fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
   594             fsm->state = ec_fsm_master_state_validate_vendor;
   594             fsm->state = ec_fsm_master_state_validate_vendor;
   595             ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x0008, EC_FSM_SII_POSITION);
   595             ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x0008,
       
   596                     EC_FSM_SII_USE_INCREMENT_ADDRESS);
   596             ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   597             ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   597             return;
   598             return;
   598         }
   599         }
   599     }
   600     }
   600 
   601 
   699         return;
   700         return;
   700     }
   701     }
   701 
   702 
   702     // vendor ID is ok. check product code.
   703     // vendor ID is ok. check product code.
   703     fsm->state = ec_fsm_master_state_validate_product;
   704     fsm->state = ec_fsm_master_state_validate_product;
   704     ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x000A, EC_FSM_SII_POSITION);
   705     ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x000A,
       
   706             EC_FSM_SII_USE_INCREMENT_ADDRESS);
   705     ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   707     ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   706 }
   708 }
   707 
   709 
   708 /*****************************************************************************/
   710 /*****************************************************************************/
   709 
   711 
   776     }
   778     }
   777 
   779 
   778     // validate next slave
   780     // validate next slave
   779     fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
   781     fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
   780     fsm->state = ec_fsm_master_state_validate_vendor;
   782     fsm->state = ec_fsm_master_state_validate_vendor;
   781     ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x0008, EC_FSM_SII_POSITION);
   783     ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x0008,
       
   784             EC_FSM_SII_USE_INCREMENT_ADDRESS);
   782     ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   785     ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   783 }
   786 }
   784 
   787 
   785 /*****************************************************************************/
   788 /*****************************************************************************/
   786 
   789 
   978     fsm->eeprom_index++;
   981     fsm->eeprom_index++;
   979     if (fsm->eeprom_index < request->word_size) {
   982     if (fsm->eeprom_index < request->word_size) {
   980         ec_fsm_sii_write(&fsm->fsm_sii, slave,
   983         ec_fsm_sii_write(&fsm->fsm_sii, slave,
   981                 request->word_offset + fsm->eeprom_index,
   984                 request->word_offset + fsm->eeprom_index,
   982                 request->data + fsm->eeprom_index * 2,
   985                 request->data + fsm->eeprom_index * 2,
   983                 EC_FSM_SII_NODE);
   986                 EC_FSM_SII_USE_CONFIGURED_ADDRESS);
   984         ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   987         ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
   985         return;
   988         return;
   986     }
   989     }
   987 
   990 
   988     // finished writing EEPROM
   991     // finished writing EEPROM