diff --git a/master/fsm_coe_map.c b/master/fsm_coe_map.c index d842c7df..b4101337 100644 --- a/master/fsm_coe_map.c +++ b/master/fsm_coe_map.c @@ -276,6 +276,7 @@ void ec_fsm_coe_map_action_next_pdo( list_for_each_entry(pdo, &fsm->pdos, list) { ec_sync_add_pdo(sync, pdo); } + sync->mapping_source = EC_SYNC_MAPPING_COE; ec_fsm_coe_map_clear_pdos(fsm); // next sync manager diff --git a/master/slave.c b/master/slave.c index 448c38ed..af633466 100644 --- a/master/slave.c +++ b/master/slave.c @@ -576,6 +576,7 @@ int ec_slave_fetch_sii_pdos( // if sync manager index is positive, the PDO is mapped by default if (pdo->sync_index >= 0) { + ec_sync_t *sync; ec_pdo_t *mapped_pdo; if (pdo->sync_index >= slave->sii_sync_count) { @@ -583,6 +584,7 @@ int ec_slave_fetch_sii_pdos( pdo->sync_index, pdo->index, slave->ring_position); return -1; } + sync = &slave->sii_syncs[pdo->sync_index]; if (!(mapped_pdo = kmalloc(sizeof(ec_pdo_t), GFP_KERNEL))) { EC_ERR("Failed to allocate PDO memory.\n"); @@ -595,8 +597,8 @@ int ec_slave_fetch_sii_pdos( return -1; } - list_add_tail(&mapped_pdo->list, - &slave->sii_syncs[pdo->sync_index].pdos); + list_add_tail(&mapped_pdo->list, &sync->pdos); + sync->mapping_source = EC_SYNC_MAPPING_SII; } } @@ -810,8 +812,12 @@ size_t ec_slave_info(const ec_slave_t *slave, /**< EtherCAT slave */ ec_sync_size(sync), sync->control_register, sync->enable ? "enable" : "disable"); - if (list_empty(&sync->pdos)) + if (list_empty(&sync->pdos)) { off += sprintf(buffer + off, " No PDOs mapped.\n"); + } else if (sync->mapping_source != EC_SYNC_MAPPING_NONE) { + off += sprintf(buffer + off, " PDO mapping information from %s.\n", + sync->mapping_source == EC_SYNC_MAPPING_SII ? "SII" : "CoE"); + } list_for_each_entry(pdo, &sync->pdos, list) { off += sprintf(buffer + off, " %s 0x%04X \"%s\"\n", @@ -830,7 +836,7 @@ size_t ec_slave_info(const ec_slave_t *slave, /**< EtherCAT slave */ // type-cast to avoid warnings on some compilers if (!list_empty((struct list_head *) &slave->sii_pdos)) - off += sprintf(buffer + off, "\nAvailable PDOs:\n"); + off += sprintf(buffer + off, "\nAvailable PDOs from SII:\n"); list_for_each_entry(pdo, &slave->sii_pdos, list) { off += sprintf(buffer + off, " %s 0x%04X \"%s\"", diff --git a/master/sync.c b/master/sync.c index c9bc06ba..0b43abbb 100644 --- a/master/sync.c +++ b/master/sync.c @@ -62,6 +62,7 @@ void ec_sync_init( sync->est_length = 0; INIT_LIST_HEAD(&sync->pdos); sync->alt_mapping = 0; + sync->mapping_source = EC_SYNC_MAPPING_NONE; } /*****************************************************************************/ diff --git a/master/sync.h b/master/sync.h index fca77151..a705b15f 100644 --- a/master/sync.h +++ b/master/sync.h @@ -53,6 +53,19 @@ /*****************************************************************************/ +/** + * EtherCAT sync manager PDO mapping information source. + */ + +typedef enum { + EC_SYNC_MAPPING_NONE, /**< No PDO mapping information */ + EC_SYNC_MAPPING_SII, /**< PDO mapping information from SII */ + EC_SYNC_MAPPING_COE /**< PDO mapping information from CoE dictionary */ +} +ec_sync_mapping_source_t; + +/*****************************************************************************/ + /** * Sync manager. */ @@ -69,6 +82,7 @@ typedef struct uint16_t est_length; /**< used to calculate the length via PDO ranges */ struct list_head pdos; /**< list of mapped PDOs */ unsigned int alt_mapping; /**< alternative mapping configured */ + ec_sync_mapping_source_t mapping_source; /**< pdo mapping source */ } ec_sync_t;