master/fsm.c
changeset 300 9cb024c1d080
parent 298 d491d1f84ebc
child 301 dfe8192a7e19
equal deleted inserted replaced
299:911f0aed65a9 300:9cb024c1d080
  1141     // configure sync managers
  1141     // configure sync managers
  1142     ec_datagram_npwr(datagram, slave->station_address, 0x0800,
  1142     ec_datagram_npwr(datagram, slave->station_address, 0x0800,
  1143                      EC_SYNC_SIZE * slave->base_sync_count);
  1143                      EC_SYNC_SIZE * slave->base_sync_count);
  1144     memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count);
  1144     memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count);
  1145 
  1145 
       
  1146 
       
  1147     // does the slave supply sync manager configurations in its EEPROM?
       
  1148     if (!list_empty(&slave->eeprom_syncs)) {
       
  1149         list_for_each_entry(eeprom_sync, &slave->eeprom_syncs, list) {
       
  1150             if (eeprom_sync->index >= slave->base_sync_count) {
       
  1151                 fsm->slave->error_flag = 1;
       
  1152                 fsm->slave_state = ec_fsm_slave_end;
       
  1153                 EC_ERR("Invalid sync manager configuration found!");
       
  1154                 return;
       
  1155             }
       
  1156             ec_eeprom_sync_config(eeprom_sync, slave,
       
  1157                                   datagram->data + EC_SYNC_SIZE
       
  1158                                   * eeprom_sync->index);
       
  1159         }
       
  1160     }
       
  1161 
  1146     // known slave type, take type's SM information
  1162     // known slave type, take type's SM information
  1147     if (slave->type) {
  1163     else if (slave->type) {
  1148         for (j = 0; slave->type->sync_managers[j] && j < EC_MAX_SYNC; j++) {
  1164         for (j = 0; slave->type->sync_managers[j] && j < EC_MAX_SYNC; j++) {
  1149             sync = slave->type->sync_managers[j];
  1165             sync = slave->type->sync_managers[j];
  1150             ec_sync_config(sync, slave, datagram->data + EC_SYNC_SIZE * j);
  1166             ec_sync_config(sync, slave, datagram->data + EC_SYNC_SIZE * j);
  1151         }
  1167         }
  1152     }
  1168     }
  1153 
  1169 
  1154     // unknown type, but slave has mailbox
  1170     // unknown type, but slave has mailbox
  1155     else if (slave->sii_mailbox_protocols)
  1171     else if (slave->sii_mailbox_protocols)
  1156     {
  1172     {
  1157         // does it supply sync manager configurations in its EEPROM?
  1173         // guess mailbox settings
  1158         if (!list_empty(&slave->eeprom_syncs)) {
  1174         mbox_sync.physical_start_address =
  1159             list_for_each_entry(eeprom_sync, &slave->eeprom_syncs, list) {
  1175             slave->sii_rx_mailbox_offset;
  1160                 if (eeprom_sync->index >= slave->base_sync_count) {
  1176         mbox_sync.length = slave->sii_rx_mailbox_size;
  1161                     fsm->slave->error_flag = 1;
  1177         mbox_sync.control_register = 0x26;
  1162                     fsm->slave_state = ec_fsm_slave_end;
  1178         mbox_sync.enable = 1;
  1163                     EC_ERR("Invalid sync manager configuration found!");
  1179         ec_eeprom_sync_config(&mbox_sync, slave, datagram->data);
  1164                     return;
  1180 
  1165                 }
  1181         mbox_sync.physical_start_address =
  1166                 ec_eeprom_sync_config(eeprom_sync, slave,
  1182             slave->sii_tx_mailbox_offset;
  1167                                       datagram->data + EC_SYNC_SIZE
  1183         mbox_sync.length = slave->sii_tx_mailbox_size;
  1168                                       * eeprom_sync->index);
  1184         mbox_sync.control_register = 0x22;
  1169             }
  1185         mbox_sync.enable = 1;
  1170         }
  1186         ec_eeprom_sync_config(&mbox_sync, slave,
  1171 
  1187                               datagram->data + EC_SYNC_SIZE);
  1172         // no sync manager information; guess mailbox settings
       
  1173         else {
       
  1174             mbox_sync.physical_start_address =
       
  1175                 slave->sii_rx_mailbox_offset;
       
  1176             mbox_sync.length = slave->sii_rx_mailbox_size;
       
  1177             mbox_sync.control_register = 0x26;
       
  1178             mbox_sync.enable = 1;
       
  1179             ec_eeprom_sync_config(&mbox_sync, slave, datagram->data);
       
  1180 
       
  1181             mbox_sync.physical_start_address =
       
  1182                 slave->sii_tx_mailbox_offset;
       
  1183             mbox_sync.length = slave->sii_tx_mailbox_size;
       
  1184             mbox_sync.control_register = 0x22;
       
  1185             mbox_sync.enable = 1;
       
  1186             ec_eeprom_sync_config(&mbox_sync, slave,
       
  1187                                   datagram->data + EC_SYNC_SIZE);
       
  1188         }
       
  1189 
  1188 
  1190         EC_INFO("Mailbox configured for unknown slave %i\n",
  1189         EC_INFO("Mailbox configured for unknown slave %i\n",
  1191                 slave->ring_position);
  1190                 slave->ring_position);
  1192     }
  1191     }
  1193 
  1192