include/ecrt.h
branchstable-1.3
changeset 1744 7bc131b92039
parent 1739 5fcbd29151d2
child 1745 07fd94c5119d
equal deleted inserted replaced
1743:1a7067207637 1744:7bc131b92039
    57 #include <stdint.h>
    57 #include <stdint.h>
    58 #endif
    58 #endif
    59 
    59 
    60 /*****************************************************************************/
    60 /*****************************************************************************/
    61 
    61 
    62 #define ECRT_VER_MAJOR 1U
    62 #define ECRT_VER_MAJOR 1
    63 #define ECRT_VER_MINOR 2U
    63 #define ECRT_VER_MINOR 3
    64 
    64 
    65 #define ECRT_VERSION(a,b) (((a) << 8) + (b))
    65 #define ECRT_VERSION(a,b) (((a) << 8) + (b))
    66 #define ECRT_VERSION_MAGIC ECRT_VERSION(ECRT_VER_MAJOR, ECRT_VER_MINOR)
    66 #define ECRT_VERSION_MAGIC ECRT_VERSION(ECRT_VER_MAJOR, ECRT_VER_MINOR)
    67 
    67 
    68 /*****************************************************************************/
    68 /*****************************************************************************/
    75 
    75 
    76 struct ec_slave;
    76 struct ec_slave;
    77 typedef struct ec_slave ec_slave_t; /**< \see ec_slave */
    77 typedef struct ec_slave ec_slave_t; /**< \see ec_slave */
    78 
    78 
    79 /**
    79 /**
    80    Initialization type for PDO registrations.
    80  * Bus status.
    81    This type is used as a parameter for the ec_domain_register_pdo_list()
    81  */
    82    function.
    82 
    83 */
    83 typedef enum {
    84 
    84     EC_BUS_FAILURE = -1, /**< At least one slave with process data exchange
    85 typedef struct
    85                            is offline. */
    86 {
    86     EC_BUS_OK            /**< All slaves with process data exchange are
    87     const char *slave_address; /**< slave address string (see
    87                            online. */
    88                                   ecrt_master_get_slave()) */
    88 }
       
    89 ec_bus_status_t;
       
    90 
       
    91 /**
       
    92  * Master status.
       
    93  * This is used for the output parameter of ecrt_master_get_status().
       
    94  */
       
    95 
       
    96 typedef struct {
       
    97     ec_bus_status_t bus_status; /**< \see ec_bus_status_t */
       
    98     unsigned int bus_tainted; /**< non-zero, if the bus topology is invalid */
       
    99     unsigned int slaves_responding; /**< number of responging slaves */
       
   100 }
       
   101 ec_master_status_t;
       
   102 
       
   103 /**
       
   104  * List entry for domain PDO registrations.
       
   105  * This type is used as a parameter for the ecrt_domain_register_pdo_list()
       
   106  * convenience function.
       
   107  */
       
   108 
       
   109 typedef struct {
       
   110     const char *slave_address; /**< slave address string
       
   111                                  \see ec_master_parse_slave_address() */
    89     uint32_t vendor_id; /**< vendor ID */
   112     uint32_t vendor_id; /**< vendor ID */
    90     uint32_t product_code; /**< product code */
   113     uint32_t product_code; /**< product code */
    91     uint16_t pdo_index; /**< PDO index */
   114     uint16_t pdo_entry_index; /**< PDO entry index */
    92     uint8_t pdo_subindex; /**< PDO subindex */
   115     uint8_t pdo_entry_subindex; /**< PDO entry subindex */
    93     void **data_ptr; /**< address of the process data pointer */
   116     void **data_ptr; /**< address of the process data pointer */
    94 }
   117 }
    95 ec_pdo_reg_t;
   118 ec_pdo_reg_t;
    96 
   119 
    97 /**
   120 /**
    98    Direction type for ec_domain_register_pdo_range()
   121  * Direction type for PDO mapping and range registration functions.
    99 */
   122  */
   100 
   123 
   101 typedef enum {EC_DIR_INPUT, EC_DIR_OUTPUT} ec_direction_t;
   124 typedef enum {
   102 
   125     EC_DIR_OUTPUT, /**< values written by master */
   103 /******************************************************************************
   126     EC_DIR_INPUT   /**< values read by master */
   104  *  Master request functions
   127 }
       
   128 ec_direction_t;
       
   129 
       
   130 /******************************************************************************
       
   131  *  Global functions
   105  *****************************************************************************/
   132  *****************************************************************************/
   106 
   133 
   107 ec_master_t *ecrt_request_master(unsigned int master_index);
   134 ec_master_t *ecrt_request_master(unsigned int master_index);
   108 void ecrt_release_master(ec_master_t *master);
   135 void ecrt_release_master(ec_master_t *master);
   109 
   136 
   116 void ecrt_master_callbacks(ec_master_t *master, int (*request_cb)(void *),
   143 void ecrt_master_callbacks(ec_master_t *master, int (*request_cb)(void *),
   117                            void (*release_cb)(void *), void *cb_data);
   144                            void (*release_cb)(void *), void *cb_data);
   118 
   145 
   119 ec_domain_t *ecrt_master_create_domain(ec_master_t *master);
   146 ec_domain_t *ecrt_master_create_domain(ec_master_t *master);
   120 
   147 
       
   148 ec_slave_t *ecrt_master_get_slave(const ec_master_t *, const char *,
       
   149         uint32_t vendor_id, uint32_t product_code);
       
   150 ec_slave_t *ecrt_master_get_slave_by_pos(const ec_master_t *, uint16_t,
       
   151         uint32_t vendor_id, uint32_t product_code);
       
   152 
   121 int ecrt_master_activate(ec_master_t *master);
   153 int ecrt_master_activate(ec_master_t *master);
   122 
   154 
   123 void ecrt_master_send(ec_master_t *master);
   155 void ecrt_master_send(ec_master_t *master);
   124 void ecrt_master_receive(ec_master_t *master);
   156 void ecrt_master_receive(ec_master_t *master);
   125 
   157 
   126 void ecrt_master_run(ec_master_t *master);
   158 void ecrt_master_get_status(const ec_master_t *master, ec_master_status_t *);
   127 
       
   128 ec_slave_t *ecrt_master_get_slave(const ec_master_t *, const char *);
       
   129 
       
   130 /** \cond */
       
   131 int ecrt_master_state(const ec_master_t *master);
       
   132 /** \endcond */
       
   133 
   159 
   134 /******************************************************************************
   160 /******************************************************************************
   135  *  Domain Methods
   161  *  Domain Methods
   136  *****************************************************************************/
   162  *****************************************************************************/
   137 
   163 
   138 ec_slave_t *ecrt_domain_register_pdo(ec_domain_t *domain,
   164 int ecrt_domain_register_pdo(ec_domain_t *domain, ec_slave_t *slave,
   139                                      const char *address,
   165         uint16_t pdo_index, uint8_t pdo_subindex, void **data_ptr);
   140                                      uint32_t vendor_id,
   166 
   141                                      uint32_t product_code,
   167 int ecrt_domain_register_pdo_range(ec_domain_t *domain, ec_slave_t *slave,
   142                                      uint16_t pdo_index,
   168         ec_direction_t direction, uint16_t offset, uint16_t length,
   143                                      uint8_t pdo_subindex,
   169         void **data_ptr);
   144                                      void **data_ptr);
       
   145 
   170 
   146 int ecrt_domain_register_pdo_list(ec_domain_t *domain,
   171 int ecrt_domain_register_pdo_list(ec_domain_t *domain,
   147                                   const ec_pdo_reg_t *pdos);
   172         const ec_pdo_reg_t *pdos);
   148 
       
   149 ec_slave_t *ecrt_domain_register_pdo_range(ec_domain_t *domain,
       
   150                                            const char *address,
       
   151                                            uint32_t vendor_id,
       
   152                                            uint32_t product_code,
       
   153                                            ec_direction_t direction,
       
   154                                            uint16_t offset,
       
   155                                            uint16_t length,
       
   156                                            void **data_ptr);
       
   157 
   173 
   158 void ecrt_domain_process(ec_domain_t *domain);
   174 void ecrt_domain_process(ec_domain_t *domain);
   159 void ecrt_domain_queue(ec_domain_t *domain);
   175 void ecrt_domain_queue(ec_domain_t *domain);
       
   176 
   160 int ecrt_domain_state(const ec_domain_t *domain);
   177 int ecrt_domain_state(const ec_domain_t *domain);
   161 
   178 
   162 /******************************************************************************
   179 /******************************************************************************
   163  *  Slave Methods
   180  *  Slave Methods
   164  *****************************************************************************/
   181  *****************************************************************************/
   168 int ecrt_slave_conf_sdo16(ec_slave_t *slave, uint16_t sdo_index,
   185 int ecrt_slave_conf_sdo16(ec_slave_t *slave, uint16_t sdo_index,
   169                           uint8_t sdo_subindex, uint16_t value);
   186                           uint8_t sdo_subindex, uint16_t value);
   170 int ecrt_slave_conf_sdo32(ec_slave_t *slave, uint16_t sdo_index,
   187 int ecrt_slave_conf_sdo32(ec_slave_t *slave, uint16_t sdo_index,
   171                           uint8_t sdo_subindex, uint32_t value);
   188                           uint8_t sdo_subindex, uint32_t value);
   172 
   189 
       
   190 void ecrt_slave_pdo_mapping_clear(ec_slave_t *, ec_direction_t);
       
   191 int ecrt_slave_pdo_mapping_add(ec_slave_t *, ec_direction_t, uint16_t);
       
   192 int ecrt_slave_pdo_mapping(ec_slave_t *, ec_direction_t, unsigned int, ...);
       
   193 
   173 /******************************************************************************
   194 /******************************************************************************
   174  *  Bitwise read/write macros
   195  *  Bitwise read/write macros
   175  *****************************************************************************/
   196  *****************************************************************************/
   176 
   197 
   177 /**
   198 /**
   178    Read a certain bit of an EtherCAT data byte.
   199  * Read a certain bit of an EtherCAT data byte.
   179    \param DATA EtherCAT data pointer
   200  * \param DATA EtherCAT data pointer
   180    \param POS bit position
   201  * \param POS bit position
   181 */
   202  */
   182 
   203 
   183 #define EC_READ_BIT(DATA, POS) ((*((uint8_t *) (DATA)) >> (POS)) & 0x01)
   204 #define EC_READ_BIT(DATA, POS) ((*((uint8_t *) (DATA)) >> (POS)) & 0x01)
   184 
   205 
   185 /**
   206 /**
   186    Write a certain bit of an EtherCAT data byte.
   207  * Write a certain bit of an EtherCAT data byte.
   187    \param DATA EtherCAT data pointer
   208  * \param DATA EtherCAT data pointer
   188    \param POS bit position
   209  * \param POS bit position
   189    \param VAL new bit value
   210  * \param VAL new bit value
   190 */
   211  */
   191 
   212 
   192 #define EC_WRITE_BIT(DATA, POS, VAL) \
   213 #define EC_WRITE_BIT(DATA, POS, VAL) \
   193     do { \
   214     do { \
   194         if (VAL) *((uint8_t *) (DATA)) |=  (1 << (POS)); \
   215         if (VAL) *((uint8_t *) (DATA)) |=  (1 << (POS)); \
   195         else     *((uint8_t *) (DATA)) &= ~(1 << (POS)); \
   216         else     *((uint8_t *) (DATA)) &= ~(1 << (POS)); \
   198 /******************************************************************************
   219 /******************************************************************************
   199  *  Read macros
   220  *  Read macros
   200  *****************************************************************************/
   221  *****************************************************************************/
   201 
   222 
   202 /**
   223 /**
   203    Read an 8-bit unsigned value from EtherCAT data.
   224  * Read an 8-bit unsigned value from EtherCAT data.
   204    \return EtherCAT data value
   225  * \return EtherCAT data value
   205 */
   226  */
   206 
   227 
   207 #define EC_READ_U8(DATA) \
   228 #define EC_READ_U8(DATA) \
   208     ((uint8_t) *((uint8_t *) (DATA)))
   229     ((uint8_t) *((uint8_t *) (DATA)))
   209 
   230 
   210 /**
   231 /**
   211    Read an 8-bit signed value from EtherCAT data.
   232  * Read an 8-bit signed value from EtherCAT data.
   212    \param DATA EtherCAT data pointer
   233  * \param DATA EtherCAT data pointer
   213    \return EtherCAT data value
   234  * \return EtherCAT data value
   214 */
   235  */
   215 
   236 
   216 #define EC_READ_S8(DATA) \
   237 #define EC_READ_S8(DATA) \
   217      ((int8_t) *((uint8_t *) (DATA)))
   238      ((int8_t) *((uint8_t *) (DATA)))
   218 
   239 
   219 /**
   240 /**
   220    Read a 16-bit unsigned value from EtherCAT data.
   241  * Read a 16-bit unsigned value from EtherCAT data.
   221    \param DATA EtherCAT data pointer
   242  * \param DATA EtherCAT data pointer
   222    \return EtherCAT data value
   243  * \return EtherCAT data value
   223 */
   244  */
   224 
   245 
   225 #define EC_READ_U16(DATA) \
   246 #define EC_READ_U16(DATA) \
   226      ((uint16_t) le16_to_cpup((void *) (DATA)))
   247      ((uint16_t) le16_to_cpup((void *) (DATA)))
   227 
   248 
   228 /**
   249 /**
   229    Read a 16-bit signed value from EtherCAT data.
   250  * Read a 16-bit signed value from EtherCAT data.
   230    \param DATA EtherCAT data pointer
   251  * \param DATA EtherCAT data pointer
   231    \return EtherCAT data value
   252  * \return EtherCAT data value
   232 */
   253  */
   233 
   254 
   234 #define EC_READ_S16(DATA) \
   255 #define EC_READ_S16(DATA) \
   235      ((int16_t) le16_to_cpup((void *) (DATA)))
   256      ((int16_t) le16_to_cpup((void *) (DATA)))
   236 
   257 
   237 /**
   258 /**
   238    Read a 32-bit unsigned value from EtherCAT data.
   259  * Read a 32-bit unsigned value from EtherCAT data.
   239    \param DATA EtherCAT data pointer
   260  * \param DATA EtherCAT data pointer
   240    \return EtherCAT data value
   261  * \return EtherCAT data value
   241 */
   262  */
   242 
   263 
   243 #define EC_READ_U32(DATA) \
   264 #define EC_READ_U32(DATA) \
   244      ((uint32_t) le32_to_cpup((void *) (DATA)))
   265      ((uint32_t) le32_to_cpup((void *) (DATA)))
   245 
   266 
   246 /**
   267 /**
   247    Read a 32-bit signed value from EtherCAT data.
   268  * Read a 32-bit signed value from EtherCAT data.
   248    \param DATA EtherCAT data pointer
   269  * \param DATA EtherCAT data pointer
   249    \return EtherCAT data value
   270  * \return EtherCAT data value
   250 */
   271  */
   251 
   272 
   252 #define EC_READ_S32(DATA) \
   273 #define EC_READ_S32(DATA) \
   253      ((int32_t) le32_to_cpup((void *) (DATA)))
   274      ((int32_t) le32_to_cpup((void *) (DATA)))
   254 
   275 
   255 
       
   256 /******************************************************************************
   276 /******************************************************************************
   257  *  Write macros
   277  *  Write macros
   258  *****************************************************************************/
   278  *****************************************************************************/
   259 
   279 
   260 /**
   280 /**
   261    Write an 8-bit unsigned value to EtherCAT data.
   281  * Write an 8-bit unsigned value to EtherCAT data.
   262    \param DATA EtherCAT data pointer
   282  * \param DATA EtherCAT data pointer
   263    \param VAL new value
   283  * \param VAL new value
   264 */
   284  */
   265 
   285 
   266 #define EC_WRITE_U8(DATA, VAL) \
   286 #define EC_WRITE_U8(DATA, VAL) \
   267     do { \
   287     do { \
   268         *((uint8_t *)(DATA)) = ((uint8_t) (VAL)); \
   288         *((uint8_t *)(DATA)) = ((uint8_t) (VAL)); \
   269     } while (0)
   289     } while (0)
   270 
   290 
   271 /**
   291 /**
   272    Write an 8-bit signed value to EtherCAT data.
   292  * Write an 8-bit signed value to EtherCAT data.
   273    \param DATA EtherCAT data pointer
   293  * \param DATA EtherCAT data pointer
   274    \param VAL new value
   294  * \param VAL new value
   275 */
   295  */
   276 
   296 
   277 #define EC_WRITE_S8(DATA, VAL) EC_WRITE_U8(DATA, VAL)
   297 #define EC_WRITE_S8(DATA, VAL) EC_WRITE_U8(DATA, VAL)
   278 
   298 
   279 /**
   299 /**
   280    Write a 16-bit unsigned value to EtherCAT data.
   300  * Write a 16-bit unsigned value to EtherCAT data.
   281    \param DATA EtherCAT data pointer
   301  * \param DATA EtherCAT data pointer
   282    \param VAL new value
   302  * \param VAL new value
   283 */
   303  */
   284 
   304 
   285 #define EC_WRITE_U16(DATA, VAL) \
   305 #define EC_WRITE_U16(DATA, VAL) \
   286     do { \
   306     do { \
   287         *((uint16_t *) (DATA)) = (uint16_t) (VAL); \
   307         *((uint16_t *) (DATA)) = (uint16_t) (VAL); \
   288         cpu_to_le16s(DATA); \
   308         cpu_to_le16s(DATA); \
   289     } while (0)
   309     } while (0)
   290 
   310 
   291 /**
   311 /**
   292    Write a 16-bit signed value to EtherCAT data.
   312  * Write a 16-bit signed value to EtherCAT data.
   293    \param DATA EtherCAT data pointer
   313  * \param DATA EtherCAT data pointer
   294    \param VAL new value
   314  * \param VAL new value
   295 */
   315  */
   296 
   316 
   297 #define EC_WRITE_S16(DATA, VAL) EC_WRITE_U16(DATA, VAL)
   317 #define EC_WRITE_S16(DATA, VAL) EC_WRITE_U16(DATA, VAL)
   298 
   318 
   299 /**
   319 /**
   300    Write a 32-bit unsigned value to EtherCAT data.
   320  * Write a 32-bit unsigned value to EtherCAT data.
   301    \param DATA EtherCAT data pointer
   321  * \param DATA EtherCAT data pointer
   302    \param VAL new value
   322  * \param VAL new value
   303 */
   323  */
   304 
   324 
   305 #define EC_WRITE_U32(DATA, VAL) \
   325 #define EC_WRITE_U32(DATA, VAL) \
   306     do { \
   326     do { \
   307         *((uint32_t *) (DATA)) = (uint32_t) (VAL); \
   327         *((uint32_t *) (DATA)) = (uint32_t) (VAL); \
   308         cpu_to_le16s(DATA); \
   328         cpu_to_le16s(DATA); \
   309     } while (0)
   329     } while (0)
   310 
   330 
   311 /**
   331 /**
   312    Write a 32-bit signed value to EtherCAT data.
   332  * Write a 32-bit signed value to EtherCAT data.
   313    \param DATA EtherCAT data pointer
   333  * \param DATA EtherCAT data pointer
   314    \param VAL new value
   334  * \param VAL new value
   315 */
   335  */
   316 
   336 
   317 #define EC_WRITE_S32(DATA, VAL) EC_WRITE_U32(DATA, VAL)
   337 #define EC_WRITE_S32(DATA, VAL) EC_WRITE_U32(DATA, VAL)
   318 
   338 
   319 /*****************************************************************************/
   339 /*****************************************************************************/
   320 
   340