diff -r 5f76a36cd9b4 -r e933f1adb550 master/slave.c --- a/master/slave.c Wed Mar 29 15:45:25 2006 +0000 +++ b/master/slave.c Fri Mar 31 09:27:34 2006 +0000 @@ -35,12 +35,19 @@ ec_master_t *master /**< EtherCAT-Master */ ) { + unsigned int i; + slave->master = master; slave->base_type = 0; slave->base_revision = 0; slave->base_build = 0; slave->base_fmmu_count = 0; slave->base_sync_count = 0; + for (i = 0; i < 2; i++) { + slave->dl_status_link[i] = 0; + slave->dl_status_loop[i] = 0; + slave->dl_status_comm[i] = 0; + } slave->ring_position = 0; slave->station_address = 0; slave->sii_alias = 0; @@ -135,11 +142,13 @@ int ec_slave_fetch(ec_slave_t *slave /**< EtherCAT-Slave */) { ec_command_t command; + unsigned int i; + uint16_t dl_status; // Read base data ec_command_init_nprd(&command, slave->station_address, 0x0000, 6); if (unlikely(ec_master_simple_io(slave->master, &command))) { - EC_ERR("Reading base datafrom slave %i failed!\n", + EC_ERR("Reading base data from slave %i failed!\n", slave->ring_position); return -1; } @@ -153,6 +162,22 @@ if (slave->base_fmmu_count > EC_MAX_FMMUS) slave->base_fmmu_count = EC_MAX_FMMUS; + // Read DL status + ec_command_init_nprd(&command, slave->station_address, 0x0110, 2); + if (unlikely(ec_master_simple_io(slave->master, &command))) { + EC_ERR("Reading DL status from slave %i failed!\n", + slave->ring_position); + return -1; + } + + dl_status = EC_READ_U16(command.data); + for (i = 0; i < 2; i++) { + slave->dl_status_link[i] = dl_status & (1 << (4 + i)) ? 1 : 0; + slave->dl_status_loop[i] = dl_status & (1 << (8 + i * 2)) ? 1 : 0; + slave->dl_status_comm[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0; + } + + // Read EEPROM data if (ec_slave_sii_read16(slave, 0x0004, &slave->sii_alias)) return -1; if (ec_slave_sii_read32(slave, 0x0008, &slave->sii_vendor_id)) @@ -869,7 +894,7 @@ ec_eeprom_pdo_entry_t *pdo_entry; ec_sdo_t *sdo; ec_sdo_entry_t *sdo_entry; - int first; + int first, i; EC_INFO("x-- EtherCAT slave information ---------------\n"); @@ -887,6 +912,14 @@ if (verbosity > 0) // Etwas geschwätziger { + EC_INFO("| Data link status:\n"); + for (i = 0; i < 2; i++) { + EC_INFO("| Port %i: link %s, loop %s, %s\n", i, + slave->dl_status_link[i] ? "up" : "down", + slave->dl_status_loop[i] ? "closed" : "open", + slave->dl_status_comm[i] ? "comm. establ." : "no comm."); + } + EC_INFO("| Base information:\n"); EC_INFO("| Type %u, Revision %i, Build %i\n", slave->base_type, slave->base_revision, slave->base_build);