master/fsm_master.h
changeset 2589 2b9c78543663
parent 2094 83e9160319ec
equal deleted inserted replaced
2415:af21f0bdc7c9 2589:2b9c78543663
     1 /******************************************************************************
     1 /******************************************************************************
     2  *
     2  *
     3  *  $Id$
     3  *  $Id$
     4  *
     4  *
     5  *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
     5  *  Copyright (C) 2006-2012  Florian Pose, Ingenieurgemeinschaft IgH
     6  *
     6  *
     7  *  This file is part of the IgH EtherCAT Master.
     7  *  This file is part of the IgH EtherCAT Master.
     8  *
     8  *
     9  *  The IgH EtherCAT Master is free software; you can redistribute it and/or
     9  *  The IgH EtherCAT Master is free software; you can redistribute it and/or
    10  *  modify it under the terms of the GNU General Public License version 2, as
    10  *  modify it under the terms of the GNU General Public License version 2, as
    37 #ifndef __EC_FSM_MASTER_H__
    37 #ifndef __EC_FSM_MASTER_H__
    38 #define __EC_FSM_MASTER_H__
    38 #define __EC_FSM_MASTER_H__
    39 
    39 
    40 #include "globals.h"
    40 #include "globals.h"
    41 #include "datagram.h"
    41 #include "datagram.h"
    42 #include "mailbox.h"
       
    43 #include "foe_request.h"
    42 #include "foe_request.h"
    44 #include "sdo_request.h"
    43 #include "sdo_request.h"
    45 #include "soe_request.h"
    44 #include "soe_request.h"
    46 #include "fsm_slave_config.h"
    45 #include "fsm_slave_config.h"
    47 #include "fsm_slave_scan.h"
    46 #include "fsm_slave_scan.h"
    56     ec_slave_t *slave; /**< EtherCAT slave. */
    55     ec_slave_t *slave; /**< EtherCAT slave. */
    57     uint16_t offset; /**< SII word offset. */
    56     uint16_t offset; /**< SII word offset. */
    58     size_t nwords; /**< Number of words. */
    57     size_t nwords; /**< Number of words. */
    59     const uint16_t *words; /**< Pointer to the data words. */
    58     const uint16_t *words; /**< Pointer to the data words. */
    60     ec_internal_request_state_t state; /**< State of the request. */
    59     ec_internal_request_state_t state; /**< State of the request. */
    61     struct kref refcount;
       
    62 } ec_sii_write_request_t;
    60 } ec_sii_write_request_t;
    63 
       
    64 void ec_master_sii_write_request_release(struct kref *);
       
    65 
       
    66 /*****************************************************************************/
       
    67 
       
    68 /** Register request.
       
    69  */
       
    70 typedef struct {
       
    71     struct list_head list; /**< List head. */
       
    72     ec_slave_t *slave; /**< EtherCAT slave. */
       
    73     ec_direction_t dir; /**< Direction. */
       
    74     uint16_t offset; /**< Register address. */
       
    75     size_t length; /**< Number of bytes. */
       
    76     uint8_t *data; /**< Data to write / memory for read data. */
       
    77     ec_internal_request_state_t state; /**< State of the request. */
       
    78     struct kref refcount;
       
    79 } ec_reg_request_t;
       
    80 
       
    81 void ec_master_reg_request_release(struct kref *);
       
    82 
       
    83 /*****************************************************************************/
       
    84 
       
    85 /** Slave/SDO request record for master's SDO request list.
       
    86  */
       
    87 typedef struct {
       
    88     struct list_head list; /**< List element. */
       
    89     ec_slave_t *slave; /**< Slave. */
       
    90     ec_sdo_request_t req; /**< SDO request. */
       
    91     struct kref refcount;
       
    92 } ec_master_sdo_request_t;
       
    93 
       
    94 void ec_master_sdo_request_release(struct kref *);
       
    95 
       
    96 /*****************************************************************************/
       
    97 
       
    98 /** FoE request.
       
    99  */
       
   100 typedef struct {
       
   101     struct list_head list; /**< List head. */
       
   102     ec_slave_t *slave; /**< EtherCAT slave. */
       
   103     ec_foe_request_t req; /**< FoE request. */
       
   104     struct kref refcount;
       
   105 } ec_master_foe_request_t;
       
   106 
       
   107 void ec_master_foe_request_release(struct kref *);
       
   108 
       
   109 /*****************************************************************************/
       
   110 
       
   111 /** SoE request.
       
   112  */
       
   113 typedef struct {
       
   114     struct list_head list; /**< List head. */
       
   115     ec_slave_t *slave; /**< EtherCAT slave. */
       
   116     ec_soe_request_t req; /**< SoE request. */
       
   117     struct kref refcount;
       
   118 } ec_master_soe_request_t;
       
   119 
       
   120 void ec_master_soe_request_release(struct kref *);
       
   121 
    61 
   122 /*****************************************************************************/
    62 /*****************************************************************************/
   123 
    63 
   124 typedef struct ec_fsm_master ec_fsm_master_t; /**< \see ec_fsm_master */
    64 typedef struct ec_fsm_master ec_fsm_master_t; /**< \see ec_fsm_master */
   125 
    65 
   126 /** Finite state machine of an EtherCAT master.
    66 /** Finite state machine of an EtherCAT master.
   127  */
    67  */
   128 struct ec_fsm_master {
    68 struct ec_fsm_master {
   129     ec_master_t *master; /**< master the FSM runs on */
    69     ec_master_t *master; /**< master the FSM runs on */
   130     ec_datagram_t *datagram; /**< datagram used in the state machine */
    70     ec_datagram_t *datagram; /**< datagram used in the state machine */
   131     ec_mailbox_t *mbox; /**< mailbox used in the state machine */
       
   132     unsigned int retries; /**< retries on datagram timeout. */
    71     unsigned int retries; /**< retries on datagram timeout. */
   133 
    72 
   134     void (*state)(ec_fsm_master_t *); /**< master state function */
    73     void (*state)(ec_fsm_master_t *); /**< master state function */
       
    74     ec_device_index_t dev_idx; /**< Current device index (for scanning etc.).
       
    75                                 */
   135     int idle; /**< state machine is in idle phase */
    76     int idle; /**< state machine is in idle phase */
   136     unsigned long scan_jiffies; /**< beginning of slave scanning */
    77     unsigned long scan_jiffies; /**< beginning of slave scanning */
   137     uint8_t link_state; /**< Last main device link state. */
    78     uint8_t link_state[EC_MAX_NUM_DEVICES]; /**< Last link state for every
   138     unsigned int slaves_responding; /**< number of responding slaves */
    79                                               device. */
       
    80     unsigned int slaves_responding[EC_MAX_NUM_DEVICES]; /**< Number of
       
    81                                                           responding slaves
       
    82                                                           for every device. */
   139     unsigned int rescan_required; /**< A bus rescan is required. */
    83     unsigned int rescan_required; /**< A bus rescan is required. */
   140     ec_slave_state_t slave_states; /**< states of responding slaves */
    84     ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]; /**< AL states of
       
    85                                                          responding slaves for
       
    86                                                          every device. */
   141     ec_slave_t *slave; /**< current slave */
    87     ec_slave_t *slave; /**< current slave */
   142     ec_sii_write_request_t *sii_request; /**< SII write request */
    88     ec_sii_write_request_t *sii_request; /**< SII write request */
   143     off_t sii_index; /**< index to SII write request data */
    89     off_t sii_index; /**< index to SII write request data */
   144     ec_sdo_request_t *sdo_request; /**< SDO request to process. */
    90     ec_sdo_request_t *sdo_request; /**< SDO request to process. */
   145     ec_reg_request_t *reg_request; /**< Register request to process. */
       
   146 
    91 
   147     ec_fsm_coe_t fsm_coe; /**< CoE state machine */
    92     ec_fsm_coe_t fsm_coe; /**< CoE state machine */
       
    93     ec_fsm_soe_t fsm_soe; /**< SoE state machine */
   148     ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */
    94     ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */
   149     ec_fsm_change_t fsm_change; /**< State change state machine */
    95     ec_fsm_change_t fsm_change; /**< State change state machine */
   150     ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */
    96     ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */
   151     ec_fsm_slave_scan_t fsm_slave_scan; /**< slave state machine */
    97     ec_fsm_slave_scan_t fsm_slave_scan; /**< slave state machine */
   152     ec_fsm_sii_t fsm_sii; /**< SII state machine */
    98     ec_fsm_sii_t fsm_sii; /**< SII state machine */
   155 /*****************************************************************************/
   101 /*****************************************************************************/
   156 
   102 
   157 void ec_fsm_master_init(ec_fsm_master_t *, ec_master_t *, ec_datagram_t *);
   103 void ec_fsm_master_init(ec_fsm_master_t *, ec_master_t *, ec_datagram_t *);
   158 void ec_fsm_master_clear(ec_fsm_master_t *);
   104 void ec_fsm_master_clear(ec_fsm_master_t *);
   159 
   105 
       
   106 void ec_fsm_master_reset(ec_fsm_master_t *);
       
   107 
   160 int ec_fsm_master_exec(ec_fsm_master_t *);
   108 int ec_fsm_master_exec(ec_fsm_master_t *);
   161 int ec_fsm_master_idle(const ec_fsm_master_t *);
   109 int ec_fsm_master_idle(const ec_fsm_master_t *);
   162 
   110 
   163 /*****************************************************************************/
   111 /*****************************************************************************/
   164 
   112