Changed Pdo entry registration function - return byte and bit positions
authorRichard Hacker <ha@igh-essen.com>
Fri, 30 May 2008 07:11:27 +0000
changeset 923 a6b51990e7e6
parent 922 fede1d8f5b71
child 924 d8d9a1056afa
Changed Pdo entry registration function - return byte and bit positions
include/ecrt.h
master/domain.c
master/slave_config.c
--- 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.
--- 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;
--- 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;
+
 
 /*****************************************************************************/