fp@104: /****************************************************************************** fp@104: * fp@104: * Oeffentliche EtherCAT-Schnittstellen fuer Echtzeitprozesse. fp@104: * fp@104: * $Id$ fp@104: * fp@104: *****************************************************************************/ fp@104: fp@104: #ifndef _ETHERCAT_RT_H_ fp@104: #define _ETHERCAT_RT_H_ fp@104: fp@104: #include fp@104: fp@110: #ifdef __KERNEL__ fp@110: #include fp@110: #else fp@110: #include fp@110: #endif fp@110: fp@104: /*****************************************************************************/ fp@104: fp@104: struct ec_master; fp@104: typedef struct ec_master ec_master_t; fp@104: fp@104: struct ec_domain; fp@104: typedef struct ec_domain ec_domain_t; fp@104: fp@104: struct ec_slave; fp@104: typedef struct ec_slave ec_slave_t; fp@104: fp@104: typedef struct fp@104: { fp@104: void **data_ptr; fp@104: const char *slave_address; fp@104: const char *vendor_name; fp@104: const char *product_name; fp@104: const char *field_name; fp@104: unsigned int field_index; fp@104: unsigned int field_count; fp@104: } fp@104: ec_field_init_t; fp@104: fp@104: /*****************************************************************************/ fp@104: // Master request functions fp@104: fp@104: ec_master_t *ecrt_request_master(unsigned int master_index); fp@104: void ecrt_release_master(ec_master_t *master); fp@104: fp@104: /*****************************************************************************/ fp@104: // Master methods fp@104: fp@104: ec_domain_t *ecrt_master_create_domain(ec_master_t *master); fp@104: int ecrt_master_activate(ec_master_t *master); fp@104: void ecrt_master_deactivate(ec_master_t *master); fp@104: void ecrt_master_sync_io(ec_master_t *master); fp@104: void ecrt_master_async_send(ec_master_t *master); fp@104: void ecrt_master_async_receive(ec_master_t *master); fp@106: void ecrt_master_prepare_async_io(ec_master_t *master); fp@104: void ecrt_master_debug(ec_master_t *master, int level); fp@104: void ecrt_master_print(const ec_master_t *master); fp@104: int ecrt_master_sdo_write(ec_master_t *master, fp@104: const char *slave_addr, fp@104: uint16_t sdo_index, fp@104: uint8_t sdo_subindex, fp@104: uint32_t value, fp@104: size_t size); fp@104: int ecrt_master_sdo_read(ec_master_t *master, fp@104: const char *slave_addr, fp@104: uint16_t sdo_index, fp@104: uint8_t sdo_subindex, fp@104: uint32_t *value); fp@104: fp@104: /*****************************************************************************/ fp@104: // Domain Methods fp@104: fp@104: ec_slave_t *ecrt_domain_register_field(ec_domain_t *domain, fp@104: const char *address, fp@104: const char *vendor_name, fp@104: const char *product_name, fp@104: void **data_ptr, fp@104: const char *field_name, fp@104: unsigned int field_index, fp@104: unsigned int field_count); fp@104: int ecrt_domain_register_field_list(ec_domain_t *domain, fp@104: ec_field_init_t *fields); fp@104: void ecrt_domain_queue(ec_domain_t *domain); fp@104: void ecrt_domain_process(ec_domain_t *domain); fp@105: int ecrt_domain_state(ec_domain_t *domain); fp@104: fp@104: /*****************************************************************************/ fp@104: // Slave Methods fp@104: fp@104: int ecrt_slave_sdo_write(ec_slave_t *slave, fp@104: uint16_t sdo_index, fp@104: uint8_t sdo_subindex, fp@104: uint32_t value, fp@104: size_t size); fp@104: int ecrt_slave_sdo_read(ec_slave_t *slave, fp@104: uint16_t sdo_index, fp@104: uint8_t sdo_subindex, fp@104: uint32_t *value); fp@104: fp@104: /*****************************************************************************/ fp@104: // Bitwise read/write macros fp@104: fp@104: #define EC_READ_BIT(PD, CH) (*((uint8_t *) (PD)) >> (CH)) & 0x01) fp@104: fp@104: #define EC_WRITE_BIT(PD, CH, VAL) \ fp@104: do { \ fp@104: if (VAL) *((uint8_t *) (PD)) |= (1 << (CH)); \ fp@104: else *((uint8_t *) (PD)) &= ~(1 << (CH)); \ fp@104: } while (0) fp@104: fp@104: /*****************************************************************************/ fp@104: // Read macros fp@104: fp@104: #define EC_READ_U8(PD) ((uint8_t) *((uint8_t *) (PD))) fp@104: #define EC_READ_S8(PD) ((int8_t) *((uint8_t *) (PD))) fp@104: fp@104: #define EC_READ_U16(PD) ((uint16_t) le16_to_cpup((void *) (PD))) fp@104: #define EC_READ_S16(PD) ((int16_t) le16_to_cpup((void *) (PD))) fp@104: fp@104: #define EC_READ_U32(PD) ((uint32_t) le32_to_cpup((void *) (PD))) fp@104: #define EC_READ_S32(PD) ((int32_t) le32_to_cpup((void *) (PD))) fp@104: fp@104: /*****************************************************************************/ fp@104: // Write macros fp@104: fp@104: #define EC_WRITE_U8(PD, VAL) \ fp@104: do { \ fp@104: *((uint8_t *)(PD)) = ((uint8_t) (VAL)); \ fp@104: } while (0) fp@104: fp@104: #define EC_WRITE_S8(PD, VAL) EC_WRITE_U8(PD, VAL) fp@104: fp@104: #define EC_WRITE_U16(PD, VAL) \ fp@104: do { \ fp@104: *((uint16_t *) (PD)) = (uint16_t) (VAL); \ fp@104: cpu_to_le16s(PD); \ fp@104: } while (0) fp@104: fp@104: #define EC_WRITE_S16(PD, VAL) EC_WRITE_U16(PD, VAL) fp@104: fp@104: #define EC_WRITE_U32(PD, VAL) \ fp@104: do { \ fp@104: *((uint32_t *) (PD)) = (uint32_t) (VAL); \ fp@104: cpu_to_le16s(PD); \ fp@104: } while (0) fp@104: fp@104: #define EC_WRITE_S32(PD, VAL) EC_WRITE_U32(PD, VAL) fp@104: fp@104: /*****************************************************************************/ fp@104: fp@104: #endif