master/fsm_slave.c
changeset 696 24fac09b5b26
parent 637 d5d04c868e0e
child 713 ae41cadd25b6
equal deleted inserted replaced
695:661ad8bd5ea1 696:24fac09b5b26
   364         slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0;
   364         slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0;
   365     }
   365     }
   366 
   366 
   367     // Start fetching EEPROM size
   367     // Start fetching EEPROM size
   368 
   368 
   369     fsm->sii_offset = 0x0040; // first category header
   369     fsm->sii_offset = EC_FIRST_EEPROM_CATEGORY_OFFSET; // first category header
   370     ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE);
   370     ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE);
   371     fsm->state = ec_fsm_slave_scan_state_eeprom_size;
   371     fsm->state = ec_fsm_slave_scan_state_eeprom_size;
   372     fsm->state(fsm); // execute state immediately
   372     fsm->state(fsm); // execute state immediately
   373 }
   373 }
   374 
   374 
   396     cat_type = EC_READ_U16(fsm->fsm_sii.value);
   396     cat_type = EC_READ_U16(fsm->fsm_sii.value);
   397     cat_size = EC_READ_U16(fsm->fsm_sii.value + 2);
   397     cat_size = EC_READ_U16(fsm->fsm_sii.value + 2);
   398 
   398 
   399     if (cat_type != 0xFFFF) { // not the last category
   399     if (cat_type != 0xFFFF) { // not the last category
   400         fsm->sii_offset += cat_size + 2;
   400         fsm->sii_offset += cat_size + 2;
       
   401         if (fsm->sii_offset >= EC_MAX_EEPROM_SIZE) {
       
   402             EC_WARN("EEPROM size of slave %i exceeds"
       
   403                     " %i words (0xffff limiter missing?).\n",
       
   404                     slave->ring_position, EC_MAX_EEPROM_SIZE);
       
   405             slave->eeprom_size = EC_FIRST_EEPROM_CATEGORY_OFFSET * 2;
       
   406             goto alloc_eeprom;
       
   407         }
   401         ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset,
   408         ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset,
   402                         EC_FSM_SII_NODE);
   409                         EC_FSM_SII_NODE);
   403         ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately
   410         ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately
   404         return;
   411         return;
   405     }
   412     }
   406 
   413 
   407     slave->eeprom_size = (fsm->sii_offset + 1) * 2;
   414     slave->eeprom_size = (fsm->sii_offset + 1) * 2;
   408 
   415 
       
   416 alloc_eeprom:
   409     if (slave->eeprom_data) {
   417     if (slave->eeprom_data) {
   410         EC_INFO("Freeing old EEPROM data on slave %i...\n",
   418         EC_INFO("Freeing old EEPROM data on slave %i...\n",
   411                 slave->ring_position);
   419                 slave->ring_position);
   412         kfree(slave->eeprom_data);
   420         kfree(slave->eeprom_data);
   413     }
   421     }
   492         EC_READ_U16(slave->eeprom_data + 2 * 0x001B);
   500         EC_READ_U16(slave->eeprom_data + 2 * 0x001B);
   493     slave->sii_mailbox_protocols =
   501     slave->sii_mailbox_protocols =
   494         EC_READ_U16(slave->eeprom_data + 2 * 0x001C);
   502         EC_READ_U16(slave->eeprom_data + 2 * 0x001C);
   495 
   503 
   496     // evaluate category data
   504     // evaluate category data
   497     cat_word = (uint16_t *) slave->eeprom_data + 0x0040;
   505     cat_word = (uint16_t *) slave->eeprom_data + EC_FIRST_EEPROM_CATEGORY_OFFSET;
   498     while (EC_READ_U16(cat_word) != 0xFFFF) {
   506     while (EC_READ_U16(cat_word) != 0xFFFF) {
   499         cat_type = EC_READ_U16(cat_word) & 0x7FFF;
   507         cat_type = EC_READ_U16(cat_word) & 0x7FFF;
   500         cat_size = EC_READ_U16(cat_word + 1);
   508         cat_size = EC_READ_U16(cat_word + 1);
   501 
   509 
   502         switch (cat_type) {
   510         switch (cat_type) {