master/master.h
branchstable-1.3
changeset 1744 7bc131b92039
parent 1739 5fcbd29151d2
child 1745 07fd94c5119d
equal deleted inserted replaced
1743:1a7067207637 1744:7bc131b92039
    42 #define _EC_MASTER_H_
    42 #define _EC_MASTER_H_
    43 
    43 
    44 #include <linux/list.h>
    44 #include <linux/list.h>
    45 #include <linux/sysfs.h>
    45 #include <linux/sysfs.h>
    46 #include <linux/timer.h>
    46 #include <linux/timer.h>
    47 #include <asm/atomic.h>
    47 #include <linux/wait.h>
    48 #include <asm/semaphore.h>
    48 #include <asm/semaphore.h>
    49 
    49 
    50 #include "device.h"
    50 #include "device.h"
    51 #include "domain.h"
    51 #include "domain.h"
    52 #include "fsm_master.h"
    52 #include "fsm_master.h"
    90    Manages slaves, domains and IO.
    90    Manages slaves, domains and IO.
    91 */
    91 */
    92 
    92 
    93 struct ec_master
    93 struct ec_master
    94 {
    94 {
    95     struct list_head list; /**< list item for module's master list */
    95     struct kobject kobj; /**< kobject */
    96     atomic_t available; /**< zero, if the master is reserved for RT */
       
    97     unsigned int index; /**< master index */
    96     unsigned int index; /**< master index */
    98 
    97     unsigned int reserved; /**< non-zero, if the master is reserved for RT */
    99     struct kobject kobj; /**< kobject */
    98 
   100 
    99     ec_device_t main_device; /**< EtherCAT device */
   101     ec_device_t *device; /**< EtherCAT device */
   100     const uint8_t *main_mac; /**< MAC address of main device */
       
   101     ec_device_t backup_device; /**< EtherCAT backup device */
       
   102     const uint8_t *backup_mac; /**< MAC address of backup device */
   102     struct semaphore device_sem; /**< device semaphore */
   103     struct semaphore device_sem; /**< device semaphore */
   103 
   104 
   104     ec_fsm_master_t fsm; /**< master state machine */
   105     ec_fsm_master_t fsm; /**< master state machine */
   105     ec_datagram_t fsm_datagram; /**< datagram used for state machines */
   106     ec_datagram_t fsm_datagram; /**< datagram used for state machines */
   106     ec_master_mode_t mode; /**< master mode */
   107     ec_master_mode_t mode; /**< master mode */
       
   108     unsigned int injection_seq_fsm; /**< datagram injection sequence number
       
   109                                       for the FSM side */
       
   110     unsigned int injection_seq_rt; /**< datagram injection sequence number
       
   111                                      for the realtime side */
   107 
   112 
   108     struct list_head slaves; /**< list of slaves on the bus */
   113     struct list_head slaves; /**< list of slaves on the bus */
   109     unsigned int slave_count; /**< number of slaves on the bus */
   114     unsigned int slave_count; /**< number of slaves on the bus */
       
   115     
       
   116     ec_request_state_t scan_state; /**< current scanning state */
       
   117     unsigned int allow_scan; /**< non-zero, if slave scanning is allowed */
       
   118     struct semaphore scan_sem; /**< semaphore protecting the scan_state
       
   119                                  variable and the allow_scan flag */
       
   120     wait_queue_head_t scan_queue; /**< queue for processes that wait for
       
   121                                     slave scanning */
       
   122 
       
   123     ec_request_state_t config_state; /**< state of slave configuration */
       
   124     unsigned int allow_config; /**< non-zero, if slave scanning is allowed */
       
   125     struct semaphore config_sem; /**< semaphore protecting the config_state
       
   126                                    variable and the allow_config flag */
       
   127     wait_queue_head_t config_queue; /**< queue for processes that wait for
       
   128                                       slave configuration */
   110 
   129 
   111     struct list_head datagram_queue; /**< datagram queue */
   130     struct list_head datagram_queue; /**< datagram queue */
   112     uint8_t datagram_index; /**< current datagram index */
   131     uint8_t datagram_index; /**< current datagram index */
   113 
   132 
   114     struct list_head domains; /**< list of domains */
   133     struct list_head domains; /**< list of domains */
   115 
   134 
   116     int debug_level; /**< master debug level */
   135     int debug_level; /**< master debug level */
   117     ec_stats_t stats; /**< cyclic statistics */
   136     ec_stats_t stats; /**< cyclic statistics */
       
   137     unsigned int pdo_slaves_offline; /** number of slaves, for which PDOs
       
   138                                        were registered and that are offline
       
   139                                        (used for bus status) */
       
   140     unsigned int frames_timed_out; /**< there were frame timeouts in the last
       
   141                                      call to ecrt_master_receive() */
   118 
   142 
   119     int thread_id; /**< master thread PID */
   143     int thread_id; /**< master thread PID */
   120     struct completion thread_exit; /**< thread completion object */
   144     struct completion thread_exit; /**< thread completion object */
   121     uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */
   145     uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */
   122     unsigned int idle_cycle_time_pos; /**< time ring buffer position */
   146     unsigned int idle_cycle_time_pos; /**< time ring buffer position */
   123 
   147 
   124     struct timer_list eoe_timer; /**< EoE timer object */
   148     struct timer_list eoe_timer; /**< EoE timer object */
       
   149     unsigned int eoe_running; /**< non-zero, if EoE processing is active. */
       
   150     struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */
   125     uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */
   151     uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */
   126     unsigned int eoe_cycle_time_pos; /**< time ring buffer position */
   152     unsigned int eoe_cycle_time_pos; /**< time ring buffer position */
   127     unsigned int eoe_running; /**< non-zero, if EoE processing is active. */
       
   128     unsigned int eoe_checked; /**< non-zero, if EoE processing is not
       
   129                                  necessary. */
       
   130     struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */
       
   131 
   153 
   132     spinlock_t internal_lock; /**< spinlock used in idle mode */
   154     spinlock_t internal_lock; /**< spinlock used in idle mode */
   133     int (*request_cb)(void *); /**< lock request callback */
   155     int (*request_cb)(void *); /**< lock request callback */
   134     void (*release_cb)(void *); /**< lock release callback */
   156     void (*release_cb)(void *); /**< lock release callback */
   135     void *cb_data; /**< data parameter of locking callbacks */
   157     void *cb_data; /**< data parameter of locking callbacks */
   136 
   158     int (*ext_request_cb)(void *); /**< external lock request callback */
   137     uint8_t eeprom_write_enable; /**< allow write operations to EEPROMs */
   159     void (*ext_release_cb)(void *); /**< externam lock release callback */
   138 
   160     void *ext_cb_data; /**< data parameter of external locking callbacks */
   139     ec_sdo_request_t *sdo_request; /**< pointer to the current SDO request */
   161 
   140     unsigned int sdo_seq_user; /**< sequence number for user space */
   162     struct list_head eeprom_requests; /**< EEPROM write requests */
   141     unsigned int sdo_seq_master; /**< sequence number for master */
   163     struct semaphore eeprom_sem; /**< semaphore protecting the list of
   142     struct semaphore sdo_sem; /**< SDO semaphore */
   164                                    EEPROM write requests */
   143     struct timer_list sdo_timer; /**< timer for polling sdo processing */
   165     wait_queue_head_t eeprom_queue; /**< wait queue for EEPROM
   144     struct completion sdo_complete; /**< SDO request completion object */
   166                                       write requests from user space */
       
   167 
       
   168     struct list_head sdo_requests; /**< SDO access requests */
       
   169     struct semaphore sdo_sem; /**< semaphore protecting the list of
       
   170                                    SDO access requests */
       
   171     wait_queue_head_t sdo_queue; /**< wait queue for SDO access requests
       
   172                                    from user space */
   145 };
   173 };
   146 
   174 
   147 /*****************************************************************************/
   175 /*****************************************************************************/
   148 
   176 
   149 // master creation/deletion
   177 // master creation/deletion
   150 int ec_master_init(ec_master_t *, unsigned int, unsigned int);
   178 int ec_master_init(ec_master_t *, struct kobject *, unsigned int,
   151 void ec_master_destroy(ec_master_t *);
   179         const uint8_t *, const uint8_t *);
       
   180 void ec_master_clear(ec_master_t *);
   152 
   181 
   153 // mode transitions
   182 // mode transitions
   154 int ec_master_enter_idle_mode(ec_master_t *);
   183 int ec_master_enter_idle_mode(ec_master_t *);
   155 void ec_master_leave_idle_mode(ec_master_t *);
   184 void ec_master_leave_idle_mode(ec_master_t *);
   156 int ec_master_enter_operation_mode(ec_master_t *);
   185 int ec_master_enter_operation_mode(ec_master_t *);
   164 void ec_master_receive_datagrams(ec_master_t *, const uint8_t *, size_t);
   193 void ec_master_receive_datagrams(ec_master_t *, const uint8_t *, size_t);
   165 void ec_master_queue_datagram(ec_master_t *, ec_datagram_t *);
   194 void ec_master_queue_datagram(ec_master_t *, ec_datagram_t *);
   166 
   195 
   167 // misc.
   196 // misc.
   168 void ec_master_output_stats(ec_master_t *);
   197 void ec_master_output_stats(ec_master_t *);
       
   198 void ec_master_clear_eoe_handlers(ec_master_t *);
   169 void ec_master_destroy_slaves(ec_master_t *);
   199 void ec_master_destroy_slaves(ec_master_t *);
   170 void ec_master_calc_addressing(ec_master_t *);
       
   171 
   200 
   172 /*****************************************************************************/
   201 /*****************************************************************************/
   173 
   202 
   174 #endif
   203 #endif