Store PDO mapping source in sync manager.

This commit is contained in:
Florian Pose 2007-10-04 08:09:41 +00:00
parent dfc4ea045f
commit 10655b7db3
4 changed files with 26 additions and 4 deletions

View File

@ -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

View File

@ -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\"",

View File

@ -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;
}
/*****************************************************************************/

View File

@ -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;