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 |