# HG changeset patch # User Richard Hacker # Date 1212131487 0 # Node ID a6b51990e7e6b420c2a9ab336686af855c1ebf6b # Parent fede1d8f5b71aed879a144231c01ca2e25012e55 Changed Pdo entry registration function - return byte and bit positions diff -r fede1d8f5b71 -r a6b51990e7e6 include/ecrt.h --- a/include/ecrt.h Thu May 29 15:11:26 2008 +0000 +++ b/include/ecrt.h Fri May 30 07:11:27 2008 +0000 @@ -57,14 +57,13 @@ * offers the possibility to use a shared-memory region. Therefore, * added the domain methods ecrt_domain_size() and * ecrt_domain_external_memory(). - * - Replaced the process data pointers in the Pdo entry registration - * functions with a process data offset, that is now returned either byte- - * or bitwise by ecrt_slave_config_reg_pdo_entry() or - * ecrt_slave_config_reg_pdo_entry_bitwise(), respectively. This was - * necessary for the external domain memory. An additional advantage is, - * that the returned offset is immediately valid. If the domain's - * process data is allocated internally, the start address can be retrieved - * with ecrt_domain_data(). + * - PDO registration functions do not return a process data pointer any + * more. Instead an offset is returned by the funtion. In addition, an + * optional bit position can be requested. + * This was necessary for the external domain memory. An additional + * advantage is, that the returned offset is immediately valid. + * If the domain's process data is allocated internally, the start + * address can be retrieved with ecrt_domain_data(). * - Replaced ecrt_slave_pdo_mapping/add/clear() with * ecrt_slave_config_pdo_assign_add() to add a Pdo to a sync manager's Pdo * assignment and ecrt_slave_config_pdo_mapping_add() to add a Pdo entry to a @@ -240,8 +239,7 @@ /** List record type for Pdo entry mass-registration. * * This type is used for the array parameter of the - * ecrt_domain_reg_pdo_entry_list() and - * ecrt_domain_reg_pdo_entry_list_bitwise() convenience functions. + * ecrt_domain_reg_pdo_entry_list() */ typedef struct { uint16_t alias; /**< Slave alias address. */ @@ -253,8 +251,11 @@ unsigned int *offset; /**< Pointer to a variable to store the Pdo's offset in the process data. This can either be byte- or bitwise, depending on whether - ecrt_domain_reg_pdo_entry_list() or - ecrt_domain_reg_pdo_entry_list_bitwise() was called. */ + ecrt_domain_reg_pdo_entry_list() */ + unsigned int *bitposition; /** Pointer to variable to store a bit + position within the address. Can be NULL, + in which case an error is raised if the + PDO does not byte-align. */ } ec_pdo_entry_reg_t; /*****************************************************************************/ @@ -519,7 +520,10 @@ * corresponding sync manager and FMMU configurations are provided for slave * configuration and the respective sync manager's assigned Pdos are appended * to the given domain, if not already done. The offset of the requested Pdo - * entry's data inside the domain's process data is returned. + * entry's data inside the domain's process data is returned. Optionally, the + * Pdo entry bit position can be retrieved if a non-null pointer is passed + * to the \a bitposition parameter. If this is null, an error is raised if + * the Pdo entry does not byte align. * * \retval >=0 Success: Offset of the Pdo entry's process data. * \retval -1 Error: Pdo entry not found. @@ -530,24 +534,9 @@ ec_slave_config_t *sc, /**< Slave configuration. */ uint16_t entry_index, /**< Index of the Pdo entry to register. */ uint8_t entry_subindex, /**< Subindex of the Pdo entry to register. */ - ec_domain_t *domain /**< Domain. */ - ); - -/** Registers a Pdo entry for process data exchange in a domain. - * - * Bitwise registration function. - * - * \see ecrt_slave_config_reg_pdo_entry(). - * - * \retval >=0 Success: Bit offset of the Pdo entry's process data. - * \retval -1 Error: Pdo entry not found. - * \retval -2 Error: Failed to register Pdo entry. - */ -int ecrt_slave_config_reg_pdo_entry_bitwise( - ec_slave_config_t *sc, /**< Slave configuration. */ - uint16_t entry_index, /**< Index of the Pdo entry to register. */ - uint8_t entry_subindex, /**< Subindex of the Pdo entry to register. */ - ec_domain_t *domain /**< Domain. */ + ec_domain_t *domain, /**< Domain. */ + unsigned int *bitposition /**< Optional address if bit addressing + is desired */ ); /** Add an Sdo configuration. @@ -647,22 +636,6 @@ registrations. */ ); -/** Registers a bunch of Pdo entries for a domain. - * - * Bitwise registration. - * - * \see ecrt_domain_reg_pdo_entry_list() - * - * \attention The registration array has to be terminated with an empty - * structure, or one with the \a index field set to zero! - * \return 0 on success, else non-zero. - */ -int ecrt_domain_reg_pdo_entry_list_bitwise( - ec_domain_t *domain, /**< Domain. */ - const ec_pdo_entry_reg_t *pdo_entry_regs /**< Array of Pdo - registrations. */ - ); - /** Returns the current size of the domain's process data. * * \return Size of the process data image. diff -r fede1d8f5b71 -r a6b51990e7e6 master/domain.c --- a/master/domain.c Thu May 29 15:11:26 2008 +0000 +++ b/master/domain.c Fri May 30 07:11:27 2008 +0000 @@ -390,31 +390,7 @@ return -1; if ((ret = ecrt_slave_config_reg_pdo_entry(sc, reg->index, - reg->subindex, domain)) < 0) - return -1; - - *reg->offset = ret; - } - - return 0; -} - -/*****************************************************************************/ - -int ecrt_domain_reg_pdo_entry_list_bitwise(ec_domain_t *domain, - const ec_pdo_entry_reg_t *regs) -{ - const ec_pdo_entry_reg_t *reg; - ec_slave_config_t *sc; - int ret; - - for (reg = regs; reg->index; reg++) { - if (!(sc = ecrt_master_slave_config(domain->master, reg->alias, - reg->position, reg->vendor_id, reg->product_code))) - return -1; - - if ((ret = ecrt_slave_config_reg_pdo_entry_bitwise(sc, reg->index, - reg->subindex, domain)) < 0) + reg->subindex, domain, reg->bitposition)) < 0) return -1; *reg->offset = ret; diff -r fede1d8f5b71 -r a6b51990e7e6 master/slave_config.c --- a/master/slave_config.c Thu May 29 15:11:26 2008 +0000 +++ b/master/slave_config.c Fri May 30 07:11:27 2008 +0000 @@ -604,34 +604,11 @@ /*****************************************************************************/ int ecrt_slave_config_reg_pdo_entry( - ec_slave_config_t *sc, /**< Slave configuration. */ - uint16_t index, /**< Index of Pdo entry to register. */ - uint8_t subindex, /**< Subindex of Pdo entry to register. */ - ec_domain_t *domain /**< Domain. */ - ) -{ - int ret = ecrt_slave_config_reg_pdo_entry_bitwise( - sc, index, subindex, domain); - - if (ret < 0) - return ret; - - if (ret % 8) { - EC_ERR("Bytewise Pdo entry registration requested, but the result is " - "not byte-aligned.\n"); - return -3; - } - - return ret / 8; -} - -/*****************************************************************************/ - -int ecrt_slave_config_reg_pdo_entry_bitwise( - ec_slave_config_t *sc, /**< Slave configuration. */ - uint16_t index, /**< Index of Pdo entry to register. */ - uint8_t subindex, /**< Subindex of Pdo entry to register. */ - ec_domain_t *domain /**< Domain. */ + ec_slave_config_t *sc, + uint16_t index, + uint8_t subindex, + ec_domain_t *domain, + unsigned int *bitpos ) { ec_direction_t dir; @@ -639,7 +616,7 @@ unsigned int bit_offset; ec_pdo_t *pdo; ec_pdo_entry_t *entry; - int ret; + int sync_offset; for (dir = EC_DIR_OUTPUT; dir <= EC_DIR_INPUT; dir++) { pdos = &sc->pdos[dir]; @@ -660,10 +637,20 @@ return -1; found: - if ((ret = ec_slave_config_prepare_fmmu(sc, domain, dir)) < 0) + sync_offset = ec_slave_config_prepare_fmmu(sc, domain, dir); + if (sync_offset < 0) return -2; - return ret * 8 + bit_offset; -} + + if (bitpos) { + *bitpos = bit_offset % 8; + } else if (bit_offset % 8) { + EC_ERR("Bytewise Pdo entry registration requested, but the result is " + "not byte-aligned.\n"); + return -3; + } + + return sync_offset + bit_offset / 8; + /*****************************************************************************/