master/fsm.c
author Florian Pose <fp@igh-essen.com>
Mon, 26 Jun 2006 16:07:07 +0000
branchstable-1.0
changeset 1623 05622513f627
parent 1621 4bbe090553f7
child 1624 9dc190591c0f
permissions -rw-r--r--
MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 *  Copyright (C) 2006  Florian Pose, Ingenieurgemeinschaft IgH
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 *  and/or modify it under the terms of the GNU General Public License
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 *  as published by the Free Software Foundation; either version 2 of the
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
 *  License, or (at your option) any later version.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
 *  The IgH EtherCAT Master is distributed in the hope that it will be
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
 *  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
 *  GNU General Public License for more details.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
 *  You should have received a copy of the GNU General Public License
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  along with the IgH EtherCAT Master; if not, write to the Free Software
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
 *  The right to use EtherCAT Technology is granted and comes free of
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
 *  charge under condition of compatibility of product made by
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
 *  Licensee. People intending to distribute/sell products based on the
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
 *  code, have to sign an agreement to guarantee that products using
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *  software based on IgH EtherCAT master stay compatible with the actual
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *  EtherCAT specification (which are released themselves as an open
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
 *  standard) as the (only) precondition to have the right to use EtherCAT
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 *  Technology, IP and trade marks.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 *
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 *****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
   \file
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
   EtherCAT finite state machines.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include "globals.h"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include "fsm.h"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include "master.h"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
void ec_fsm_master_start(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
void ec_fsm_master_broadcast(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
void ec_fsm_master_proc_states(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
void ec_fsm_master_scan(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
void ec_fsm_master_states(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
void ec_fsm_master_validate_vendor(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
void ec_fsm_master_validate_product(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
void ec_fsm_master_reconfigure(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
void ec_fsm_master_address(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
void ec_fsm_master_conf(ec_fsm_t *);
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    57
void ec_fsm_master_eeprom(ec_fsm_t *);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
void ec_fsm_slave_start_reading(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
void ec_fsm_slave_read_status(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
void ec_fsm_slave_read_base(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
void ec_fsm_slave_read_dl(ec_fsm_t *);
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    63
void ec_fsm_slave_eeprom_size(ec_fsm_t *);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    64
void ec_fsm_slave_fetch_eeprom(ec_fsm_t *);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    65
void ec_fsm_slave_fetch_eeprom2(ec_fsm_t *);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
void ec_fsm_slave_end(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
void ec_fsm_slave_conf(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
void ec_fsm_slave_sync(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
void ec_fsm_slave_preop(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
void ec_fsm_slave_fmmu(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
void ec_fsm_slave_saveop(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
void ec_fsm_slave_op(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
void ec_fsm_slave_op2(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
void ec_fsm_sii_start_reading(ec_fsm_t *);
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    77
void ec_fsm_sii_read_check(ec_fsm_t *);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    78
void ec_fsm_sii_read_fetch(ec_fsm_t *);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    79
void ec_fsm_sii_start_writing(ec_fsm_t *);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    80
void ec_fsm_sii_write_check(ec_fsm_t *);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
    81
void ec_fsm_sii_write_check2(ec_fsm_t *);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
void ec_fsm_sii_end(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
void ec_fsm_sii_error(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
void ec_fsm_change_start(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
void ec_fsm_change_check(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
void ec_fsm_change_status(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
void ec_fsm_change_code(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
void ec_fsm_change_ack(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
void ec_fsm_change_ack2(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
void ec_fsm_change_end(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
void ec_fsm_change_error(ec_fsm_t *);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
   Constructor.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
int ec_fsm_init(ec_fsm_t *fsm, /**< finite state machine */
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
                ec_master_t *master /**< EtherCAT master */
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
                )
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
    fsm->master = master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
    fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
    fsm->master_slaves_responding = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
    fsm->master_slave_states = EC_SLAVE_STATE_UNKNOWN;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
    fsm->master_validation = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
    ec_command_init(&fsm->command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
    if (ec_command_prealloc(&fsm->command, EC_MAX_DATA_SIZE)) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
        EC_ERR("FSM failed to allocate FSM command.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
        return -1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
    return 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
   Destructor.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
void ec_fsm_clear(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
    ec_command_clear(&fsm->command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
   Resets the state machine.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
void ec_fsm_reset(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
    fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
    fsm->master_slaves_responding = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
    fsm->master_slave_states = EC_SLAVE_STATE_UNKNOWN;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
   Executes the current state of the state machine.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
void ec_fsm_execute(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
    fsm->master_state(fsm);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
/******************************************************************************
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
 *  master state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
 *****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
   Master state: START.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
   Starts with getting slave count and slave states.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
void ec_fsm_master_start(ec_fsm_t *fsm)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
    ec_command_brd(&fsm->command, 0x0130, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
    ec_master_queue_command(fsm->master, &fsm->command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
    fsm->master_state = ec_fsm_master_broadcast;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
   Master state: BROADCAST.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
   Processes the broadcast read slave count and slaves states.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
void ec_fsm_master_broadcast(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
    unsigned int topology_change, states_change, i;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
    ec_slave_t *slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
    ec_master_t *master = fsm->master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
    if (command->state != EC_CMD_RECEIVED) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
        if (!master->device->link_state) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
            fsm->master_slaves_responding = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
            list_for_each_entry(slave, &master->slaves, list) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
                slave->online = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
    topology_change = (command->working_counter !=
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
                       fsm->master_slaves_responding);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
    states_change = (EC_READ_U8(command->data) != fsm->master_slave_states);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
    fsm->master_slave_states = EC_READ_U8(command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
    fsm->master_slaves_responding = command->working_counter;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
    if (topology_change) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
        EC_INFO("%i slave%s responding.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
                fsm->master_slaves_responding,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
                fsm->master_slaves_responding == 1 ? "" : "s");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
        if (master->mode == EC_MASTER_MODE_RUNNING) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
            if (fsm->master_slaves_responding == master->slave_count) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
                fsm->master_validation = 1; // start validation later
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
            else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
                EC_WARN("Invalid slave count. Bus in tainted state.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
    if (states_change) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
        EC_INFO("Slave states: ");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
        ec_print_states(fsm->master_slave_states);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
        printk(".\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
    // topology change in free-run mode: clear all slaves and scan the bus
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
    if (topology_change && master->mode == EC_MASTER_MODE_FREERUN) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
        EC_INFO("Scanning bus.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
        ec_master_eoe_stop(master);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
        ec_master_clear_slaves(master);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
        if (!fsm->master_slaves_responding) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
            // no slaves present -> finish state machine.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
            fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
            fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
            return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
        // init slaves
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
        for (i = 0; i < fsm->master_slaves_responding; i++) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
            if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
                                                 GFP_ATOMIC))) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
                EC_ERR("Failed to allocate slave %i!\n", i);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
                fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
                fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
                return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
            if (ec_slave_init(slave, master, i, i + 1)) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
                fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
                fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
                return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
            if (kobject_add(&slave->kobj)) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
                EC_ERR("Failed to add kobject.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
                kobject_put(&slave->kobj); // free
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
                fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
                fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
                return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
            list_add_tail(&slave->list, &master->slaves);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
        // begin scanning of slaves
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
        fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
        fsm->slave_state = ec_fsm_slave_start_reading;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
        fsm->master_state = ec_fsm_master_scan;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
    // fetch state from each slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
    fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
    ec_command_nprd(&fsm->command, fsm->slave->station_address, 0x0130, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
    ec_master_queue_command(master, &fsm->command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
    fsm->master_state = ec_fsm_master_states;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
   Master action: Get state of next slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
void ec_fsm_master_action_next_slave_state(ec_fsm_t *fsm
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
                                           /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
    ec_master_t *master = fsm->master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
    // have all states been read?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
    if (slave->list.next == &master->slaves) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
        // check, if a bus validation has to be done
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
        if (fsm->master_validation) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
            fsm->master_validation = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
            list_for_each_entry(slave, &master->slaves, list) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
                if (slave->online) continue;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
                // At least one slave is offline. validate!
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
                EC_INFO("Validating bus.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
                fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
                fsm->master_state = ec_fsm_master_validate_vendor;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
                fsm->sii_offset = 0x0008; // vendor ID
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
                fsm->sii_mode = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
                fsm->sii_state = ec_fsm_sii_start_reading;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
                fsm->sii_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
                return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
        fsm->master_state = ec_fsm_master_proc_states;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
    // process next slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
    fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
    ec_command_nprd(&fsm->command, fsm->slave->station_address, 0x0130, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
    ec_master_queue_command(master, &fsm->command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
    fsm->master_state = ec_fsm_master_states;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
   Master state: STATES.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
   Fetches the AL- and online state of a slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
void ec_fsm_master_states(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
    uint8_t new_state;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
    if (command->state != EC_CMD_RECEIVED) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
    // did the slave not respond to its station address?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
    if (command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
        if (slave->online) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
            slave->online = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
            EC_INFO("Slave %i: offline.\n", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
        ec_fsm_master_action_next_slave_state(fsm);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
    // slave responded
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
    new_state = EC_READ_U8(command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
    if (!slave->online) { // slave was offline before
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
        slave->online = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
        slave->state_error = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
        slave->current_state = new_state;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
        EC_INFO("Slave %i: online (", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
        ec_print_states(new_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
        printk(").\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
    else if (new_state != slave->current_state) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
        EC_INFO("Slave %i: ", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
        ec_print_states(slave->current_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
        printk(" -> ");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
        ec_print_states(new_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
        printk(".\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
        slave->current_state = new_state;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
    ec_fsm_master_action_next_slave_state(fsm);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
   Master state: PROC_STATES.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
   Processes the slave states.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
void ec_fsm_master_proc_states(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
    ec_master_t *master = fsm->master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
    ec_slave_t *slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
    // check if any slaves are not in the state, they're supposed to be
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
    list_for_each_entry(slave, &master->slaves, list) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
        if (slave->state_error || !slave->online ||
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
            slave->requested_state == EC_SLAVE_STATE_UNKNOWN ||
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
            slave->current_state == slave->requested_state) continue;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
        EC_INFO("Changing state of slave %i from ", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
        ec_print_states(slave->current_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
        printk(" to ");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
        ec_print_states(slave->requested_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
        printk(".\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
        fsm->slave = slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
        fsm->slave_state = ec_fsm_slave_conf;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
        fsm->change_new = EC_SLAVE_STATE_INIT;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
        fsm->change_state = ec_fsm_change_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
        fsm->master_state = ec_fsm_master_conf;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   409
    if (master->mode == EC_MASTER_MODE_FREERUN) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   410
        // nothing to configure. check for pending EEPROM write operations.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   411
        list_for_each_entry(slave, &master->slaves, list) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   412
            if (!slave->new_eeprom_data) continue;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   413
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   414
            // found pending EEPROM write operation. execute it!
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   415
            EC_INFO("Writing EEPROM of slave %i...\n", slave->ring_position);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   416
            fsm->sii_offset = 0x0000;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   417
            memcpy(fsm->sii_value, slave->new_eeprom_data, 2);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   418
            fsm->sii_mode = 1;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   419
            fsm->sii_state = ec_fsm_sii_start_writing;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   420
            fsm->slave = slave;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   421
            fsm->master_state = ec_fsm_master_eeprom;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   422
            fsm->master_state(fsm); // execute immediately
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   423
            return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   424
        }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   425
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   426
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   427
    // nothing to do. restart master state machine.
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
    fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
    fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
   Master state: VALIDATE_VENDOR.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
   Validates the vendor ID of a slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
void ec_fsm_master_validate_vendor(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
    fsm->sii_state(fsm); // execute SII state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
    if (fsm->sii_state == ec_fsm_sii_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
        EC_ERR("Failed to validate vendor ID of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
    if (fsm->sii_state != ec_fsm_sii_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   455
    if (EC_READ_U32(fsm->sii_value) != slave->sii_vendor_id) {
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
        EC_ERR("Slave %i: invalid vendor ID!\n", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
    // vendor ID is ok. check product code.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
    fsm->master_state = ec_fsm_master_validate_product;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
    fsm->sii_offset = 0x000A; // product code
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
    fsm->sii_mode = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
    fsm->sii_state = ec_fsm_sii_start_reading;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
    fsm->sii_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
   Master state: VALIDATE_PRODUCT.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
   Validates the product ID of a slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
void ec_fsm_master_validate_product(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
    fsm->sii_state(fsm); // execute SII state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
    if (fsm->sii_state == ec_fsm_sii_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
        EC_ERR("Failed to validate product code of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
    if (fsm->sii_state != ec_fsm_sii_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   493
    if (EC_READ_U32(fsm->sii_value) != slave->sii_product_code) {
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
        EC_ERR("Slave %i: invalid product code!\n", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
        EC_ERR("expected 0x%08X, got 0x%08X.\n", slave->sii_product_code,
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   496
               EC_READ_U32(fsm->sii_value));
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
    // have all states been validated?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
    if (slave->list.next == &fsm->master->slaves) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
        fsm->slave = list_entry(fsm->master->slaves.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
        fsm->master_state = ec_fsm_master_reconfigure;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
    // validate next slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
    fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
    fsm->master_state = ec_fsm_master_validate_vendor;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
    fsm->sii_offset = 0x0008; // vendor ID
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
    fsm->sii_mode = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
    fsm->sii_state = ec_fsm_sii_start_reading;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
    fsm->sii_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
   Master state: RECONFIGURE.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
   Looks for slave, that have lost their configuration and writes
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
   their station address, so that they can be reconfigured later.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
void ec_fsm_master_reconfigure(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
    while (fsm->slave->online) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
        if (fsm->slave->list.next == &fsm->master->slaves) { // last slave?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
            fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
            fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
            return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
        // check next slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
        fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
    EC_INFO("Reinitializing slave %i.\n", fsm->slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
    // write station address
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
    ec_command_apwr(command, fsm->slave->ring_position, 0x0010, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
    EC_WRITE_U16(command->data, fsm->slave->station_address);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
    fsm->master_state = ec_fsm_master_address;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
   Master state: ADDRESS.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
   Checks, if the new station address has been written to the slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
void ec_fsm_master_address(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
        EC_ERR("Failed to write station address on slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
    if (fsm->slave->list.next == &fsm->master->slaves) { // last slave?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
    // check next slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
    fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
    fsm->master_state = ec_fsm_master_reconfigure;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
    fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
   Master state: SCAN.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
   Executes the sub-statemachine for the scanning of a slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
void ec_fsm_master_scan(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
    ec_master_t *master = fsm->master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
    uint16_t coupler_index, coupler_subindex;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
    uint16_t reverse_coupler_index, current_coupler_index;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
    ec_slave_ident_t *ident;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
    fsm->slave_state(fsm); // execute slave state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
    if (fsm->slave_state != ec_fsm_slave_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
    // have all slaves been fetched?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
    if (slave->list.next == &master->slaves) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
        EC_INFO("Bus scanning completed.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
        // identify all slaves and calculate coupler addressing
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
        coupler_index = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
        reverse_coupler_index = 0xFFFF;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
        current_coupler_index = 0x3FFF;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
        coupler_subindex = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
        list_for_each_entry(slave, &master->slaves, list)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
        {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
            // search for identification in "database"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
            ident = slave_idents;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
            while (ident->type) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
                if (ident->vendor_id == slave->sii_vendor_id
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
                    && ident->product_code == slave->sii_product_code) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
                    slave->type = ident->type;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
                    break;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
                }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
                ident++;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
            if (!slave->type) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
                EC_WARN("FSM: Unknown slave device (vendor 0x%08X,"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
                        " code 0x%08X) at position %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
                        slave->sii_vendor_id, slave->sii_product_code,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
                        slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
            else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
                // if the slave is a bus coupler, change adressing base
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
                if (slave->type->special == EC_TYPE_BUS_COUPLER) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
                    if (slave->sii_alias)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
                        current_coupler_index = reverse_coupler_index--;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
                    else
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
                        current_coupler_index = coupler_index++;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
                    coupler_subindex = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
                }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
            // determine initial state.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
            if ((slave->type && slave->type->special == EC_TYPE_BUS_COUPLER)) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
                slave->requested_state = EC_SLAVE_STATE_OP;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
            else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
                if (master->mode == EC_MASTER_MODE_RUNNING)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
                    slave->requested_state = EC_SLAVE_STATE_PREOP;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
                else
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
                    slave->requested_state = EC_SLAVE_STATE_INIT;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
            slave->state_error = 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
            // calculate coupler-based slave address
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
            slave->coupler_index = current_coupler_index;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
            slave->coupler_subindex = coupler_subindex;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
            coupler_subindex++;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
        if (master->mode == EC_MASTER_MODE_FREERUN) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
            // start EoE processing
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
            ec_master_eoe_start(master);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
        fsm->master_state = ec_fsm_master_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
        fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
    // process next slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
    fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
    fsm->slave_state = ec_fsm_slave_start_reading;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
    fsm->slave_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
   Master state: CONF.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
   Starts configuring a slave.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
void ec_fsm_master_conf(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
    fsm->slave_state(fsm); // execute slave's state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
    if (fsm->slave_state != ec_fsm_slave_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
    fsm->master_state = ec_fsm_master_proc_states;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
    fsm->master_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   687
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   688
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   689
/**
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   690
   Master state: EEPROM.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   691
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   692
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   693
void ec_fsm_master_eeprom(ec_fsm_t *fsm /**< finite state machine */)
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   694
{
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   695
    ec_slave_t *slave = fsm->slave;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   696
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   697
    fsm->sii_state(fsm); // execute SII state machine
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   698
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   699
    if (fsm->sii_state == ec_fsm_sii_error) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   700
        EC_ERR("Failed to write EEPROM contents to slave %i.\n",
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   701
               slave->ring_position);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   702
        kfree(slave->new_eeprom_data);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   703
        slave->new_eeprom_data = NULL;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   704
        fsm->master_state = ec_fsm_master_start;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   705
        fsm->master_state(fsm); // execute immediately
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   706
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   707
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   708
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   709
    if (fsm->sii_state != ec_fsm_sii_end) return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   710
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   711
    fsm->sii_offset++;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   712
    if (fsm->sii_offset < slave->new_eeprom_size) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   713
        memcpy(fsm->sii_value, slave->new_eeprom_data + fsm->sii_offset, 2);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   714
        fsm->sii_state = ec_fsm_sii_start_writing;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   715
        fsm->sii_state(fsm); // execute immediately
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   716
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   717
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   718
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   719
    // finished writing EEPROM
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   720
    EC_INFO("Finished writing EEPROM of slave %i.\n", slave->ring_position);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   721
    kfree(slave->new_eeprom_data);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   722
    slave->new_eeprom_data = NULL;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   723
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   724
    // restart master state machine.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   725
    fsm->master_state = ec_fsm_master_start;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   726
    fsm->master_state(fsm); // execute immediately
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   727
    return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   728
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   729
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
/******************************************************************************
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
 *  slave state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
 *****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
   Slave state: START_READING.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
   First state of the slave state machine. Writes the station address to the
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
   slave, according to its ring position.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
void ec_fsm_slave_start_reading(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
    // write station address
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
    ec_command_apwr(command, fsm->slave->ring_position, 0x0010, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
    EC_WRITE_U16(command->data, fsm->slave->station_address);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
    fsm->slave_state = ec_fsm_slave_read_status;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
   Slave state: READ_STATUS.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
void ec_fsm_slave_read_status(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
        EC_ERR("FSM failed to write station address of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
               fsm->slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
    // read AL status
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
    ec_command_nprd(command, fsm->slave->station_address, 0x0130, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
    fsm->slave_state = ec_fsm_slave_read_base;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
   Slave state: READ_BASE.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
void ec_fsm_slave_read_base(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
        EC_ERR("FSM failed to read AL status of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
               fsm->slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
    slave->current_state = EC_READ_U8(command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
    if (slave->current_state & EC_ACK) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
        EC_WARN("Slave %i has status error bit set (0x%02X)!\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
                slave->ring_position, slave->current_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
        slave->current_state &= 0x0F;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
    // read base data
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
    ec_command_nprd(command, fsm->slave->station_address, 0x0000, 6);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
    fsm->slave_state = ec_fsm_slave_read_dl;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
   Slave state: READ_DL.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
void ec_fsm_slave_read_dl(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
        EC_ERR("FSM failed to read base data of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
    slave->base_type       = EC_READ_U8 (command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
    slave->base_revision   = EC_READ_U8 (command->data + 1);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
    slave->base_build      = EC_READ_U16(command->data + 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
    slave->base_fmmu_count = EC_READ_U8 (command->data + 4);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
    slave->base_sync_count = EC_READ_U8 (command->data + 5);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
    if (slave->base_fmmu_count > EC_MAX_FMMUS)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
        slave->base_fmmu_count = EC_MAX_FMMUS;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
    // read data link status
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
    ec_command_nprd(command, slave->station_address, 0x0110, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
    ec_master_queue_command(slave->master, command);
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   835
    fsm->slave_state = ec_fsm_slave_eeprom_size;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   836
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   837
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   838
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   839
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   840
/**
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   841
   Slave state: EEPROM_SIZE.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   842
   Read the actual size of the EEPROM to allocate the EEPROM image.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   843
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   844
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   845
void ec_fsm_slave_eeprom_size(ec_fsm_t *fsm /**< finite state machine */)
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
    uint16_t dl_status;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
    unsigned int i;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
        EC_ERR("FSM failed to read DL status of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
    dl_status = EC_READ_U16(command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
    for (i = 0; i < 4; i++) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
        slave->dl_link[i] = dl_status & (1 << (4 + i)) ? 1 : 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
        slave->dl_loop[i] = dl_status & (1 << (8 + i * 2)) ? 1 : 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
        slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   866
    // Start fetching EEPROM size
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   867
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   868
    fsm->sii_offset = 0x0040; // first category header
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
    fsm->sii_mode = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
    fsm->sii_state = ec_fsm_sii_start_reading;
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   871
    fsm->slave_state = ec_fsm_slave_fetch_eeprom;
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
    fsm->slave_state(fsm); // execute state immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
/**
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   878
   Slave state: FETCH_EEPROM.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   879
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   880
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   881
void ec_fsm_slave_fetch_eeprom(ec_fsm_t *fsm /**< finite state machine */)
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   882
{
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   883
    ec_slave_t *slave = fsm->slave;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   884
    uint16_t cat_type, cat_size;
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
    // execute SII state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
    fsm->sii_state(fsm);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
    if (fsm->sii_state == ec_fsm_sii_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
        fsm->slave_state = ec_fsm_slave_end;
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   891
        EC_ERR("Failed to read EEPROM size of slave %i.\n",
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   892
               slave->ring_position);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
    if (fsm->sii_state != ec_fsm_sii_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   898
    cat_type = EC_READ_U16(fsm->sii_value);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   899
    cat_size = EC_READ_U16(fsm->sii_value + 2);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   900
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   901
    if (cat_type != 0xFFFF) { // not the last category
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   902
        fsm->sii_offset += cat_size + 2;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   903
        fsm->sii_state = ec_fsm_sii_start_reading;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   904
        fsm->sii_state(fsm); // execute state immediately
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   905
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   906
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   907
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   908
    slave->eeprom_size = (fsm->sii_offset + 1) * 2;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   909
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   910
    if (slave->eeprom_data) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   911
        EC_INFO("Freeing old EEPROM data on slave %i...\n",
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   912
                slave->ring_position);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   913
        kfree(slave->eeprom_data);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   914
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   915
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   916
    if (!(slave->eeprom_data =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   917
          (uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   918
        EC_ERR("Failed to allocate EEPROM data on slave %i.\n",
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   919
               slave->ring_position);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   920
        fsm->slave_state = ec_fsm_slave_end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   921
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   922
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   923
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   924
    // Start fetching EEPROM contents
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   925
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   926
    fsm->sii_offset = 0x0000;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   927
    fsm->sii_mode = 1;
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
    fsm->sii_state = ec_fsm_sii_start_reading;
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   929
    fsm->slave_state = ec_fsm_slave_fetch_eeprom2;
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
    fsm->slave_state(fsm); // execute state immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
/**
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   936
   Slave state: FETCH_EEPROM2.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   937
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   938
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   939
void ec_fsm_slave_fetch_eeprom2(ec_fsm_t *fsm /**< finite state machine */)
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   940
{
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   941
    ec_slave_t *slave = fsm->slave;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   942
    uint16_t *cat_word, cat_type, cat_size;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   943
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
    // execute SII state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
    fsm->sii_state(fsm);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
    if (fsm->sii_state == ec_fsm_sii_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
        fsm->slave_state = ec_fsm_slave_end;
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   949
        EC_ERR("Failed to fetch EEPROM contents of slave %i.\n",
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   950
               slave->ring_position);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
    if (fsm->sii_state != ec_fsm_sii_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   956
    // 2 words fetched
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   957
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   958
    if (fsm->sii_offset + 2 <= slave->eeprom_size / 2) { // 2 words fit
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   959
        memcpy(slave->eeprom_data + fsm->sii_offset * 2, fsm->sii_value, 4);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   960
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   961
    else { // copy the last word
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   962
        memcpy(slave->eeprom_data + fsm->sii_offset * 2, fsm->sii_value, 2);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   963
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   964
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   965
    if (fsm->sii_offset + 2 < slave->eeprom_size / 2) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   966
        // fetch the next 2 words
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   967
        fsm->sii_offset += 2;
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
        fsm->sii_state = ec_fsm_sii_start_reading;
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   969
        fsm->sii_state(fsm); // execute state immediately
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   970
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   971
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   972
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   973
    // Evaluate EEPROM contents
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   974
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   975
    slave->sii_alias =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   976
        EC_READ_U16(slave->eeprom_data + 2 * 0x0004);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   977
    slave->sii_vendor_id =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   978
        EC_READ_U32(slave->eeprom_data + 2 * 0x0008);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   979
    slave->sii_product_code =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   980
        EC_READ_U32(slave->eeprom_data + 2 * 0x000A);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   981
    slave->sii_revision_number =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   982
        EC_READ_U32(slave->eeprom_data + 2 * 0x000C);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   983
    slave->sii_serial_number =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   984
        EC_READ_U32(slave->eeprom_data + 2 * 0x000E);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   985
    slave->sii_rx_mailbox_offset =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   986
        EC_READ_U16(slave->eeprom_data + 2 * 0x0018);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   987
    slave->sii_rx_mailbox_size =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   988
        EC_READ_U16(slave->eeprom_data + 2 * 0x0019);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   989
    slave->sii_tx_mailbox_offset =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   990
        EC_READ_U16(slave->eeprom_data + 2 * 0x001A);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   991
    slave->sii_tx_mailbox_size =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   992
        EC_READ_U16(slave->eeprom_data + 2 * 0x001B);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   993
    slave->sii_mailbox_protocols =
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   994
        EC_READ_U16(slave->eeprom_data + 2 * 0x001C);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   995
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   996
    // evaluate category data
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   997
    cat_word = (uint16_t *) slave->eeprom_data + 0x0040;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   998
    while (EC_READ_U16(cat_word) != 0xFFFF) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
   999
        cat_type = EC_READ_U16(cat_word) & 0x7FFF;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1000
        cat_size = EC_READ_U16(cat_word + 1);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1001
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1002
        switch (cat_type) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1003
            case 0x000A:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1004
                if (ec_slave_fetch_strings(slave, (uint8_t *) (cat_word + 2)))
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1005
                    goto end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1006
                break;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1007
            case 0x001E:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1008
                if (ec_slave_fetch_general(slave, (uint8_t *) (cat_word + 2)))
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1009
                    goto end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1010
                break;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1011
            case 0x0028:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1012
                break;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1013
            case 0x0029:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1014
                if (ec_slave_fetch_sync(slave, (uint8_t *) (cat_word + 2),
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1015
                                        cat_size))
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1016
                    goto end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1017
                break;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1018
            case 0x0032:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1019
                if (ec_slave_fetch_pdo(slave, (uint8_t *) (cat_word + 2),
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1020
                                       cat_size, EC_TX_PDO))
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1021
                    goto end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1022
                break;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1023
            case 0x0033:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1024
                if (ec_slave_fetch_pdo(slave, (uint8_t *) (cat_word + 2),
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1025
                                       cat_size, EC_RX_PDO))
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1026
                    goto end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1027
                break;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1028
            default:
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1029
                EC_WARN("Unknown category type 0x%04X in slave %i.\n",
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1030
                        cat_type, slave->ring_position);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1031
        }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1032
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1033
        cat_word += cat_size + 2;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1034
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1035
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1036
 end:
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
    fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
   Slave state: CONF.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
void ec_fsm_slave_conf(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
    ec_master_t *master = fsm->master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
    fsm->change_state(fsm); // execute state change state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
    if (fsm->change_state == ec_fsm_change_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
    if (fsm->change_state != ec_fsm_change_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
    // slave is now in INIT
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
    if (slave->current_state == slave->requested_state) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
    // check for slave registration
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
    if (!slave->type) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
        EC_WARN("Slave %i has unknown type!\n", slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
    // check and reset CRC fault counters
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
    //ec_slave_check_crc(slave);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
    if (!slave->base_fmmu_count) { // no fmmus
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
        fsm->slave_state = ec_fsm_slave_sync;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
        fsm->slave_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
    // reset FMMUs
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
    ec_command_npwr(command, slave->station_address, 0x0600,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
                    EC_FMMU_SIZE * slave->base_fmmu_count);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
    memset(command->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
    ec_master_queue_command(master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
    fsm->slave_state = ec_fsm_slave_sync;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
   Slave state: SYNC.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
   Configure sync managers.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
void ec_fsm_slave_sync(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
    unsigned int j;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
    const ec_sync_t *sync;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
    ec_eeprom_sync_t *eeprom_sync, mbox_sync;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
        EC_ERR("Failed to reset FMMUs of slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
        slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
    if (!slave->base_sync_count) { // no sync managers
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
        fsm->slave_state = ec_fsm_slave_preop;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
        fsm->slave_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
    // configure sync managers
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
    ec_command_npwr(command, slave->station_address, 0x0800,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
                    EC_SYNC_SIZE * slave->base_sync_count);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
    memset(command->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
    // known slave type, take type's SM information
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
    if (slave->type) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
        for (j = 0; slave->type->sync_managers[j] && j < EC_MAX_SYNC; j++) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
            sync = slave->type->sync_managers[j];
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1127
            ec_sync_config(sync, slave, command->data + EC_SYNC_SIZE * j);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
    // unknown type, but slave has mailbox
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
    else if (slave->sii_mailbox_protocols)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
    {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
        // does it supply sync manager configurations in its EEPROM?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
        if (!list_empty(&slave->eeprom_syncs)) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
            list_for_each_entry(eeprom_sync, &slave->eeprom_syncs, list) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
                if (eeprom_sync->index >= slave->base_sync_count) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
                    EC_ERR("Invalid sync manager configuration found!");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
                    fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
                    return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
                }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
                ec_eeprom_sync_config(eeprom_sync,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
                                      command->data + EC_SYNC_SIZE
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
                                      * eeprom_sync->index);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
            }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
        // no sync manager information; guess mailbox settings
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
        else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
            mbox_sync.physical_start_address =
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
                slave->sii_rx_mailbox_offset;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
            mbox_sync.length = slave->sii_rx_mailbox_size;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
            mbox_sync.control_register = 0x26;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
            mbox_sync.enable = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
            ec_eeprom_sync_config(&mbox_sync, command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
            mbox_sync.physical_start_address =
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
                slave->sii_tx_mailbox_offset;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
            mbox_sync.length = slave->sii_tx_mailbox_size;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
            mbox_sync.control_register = 0x22;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
            mbox_sync.enable = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
            ec_eeprom_sync_config(&mbox_sync,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
                                  command->data + EC_SYNC_SIZE);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
        EC_INFO("Mailbox configured for unknown slave %i\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
                slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
    fsm->slave_state = ec_fsm_slave_preop;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
   Slave state: PREOP.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
   Change slave state to PREOP.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
void ec_fsm_slave_preop(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
        EC_ERR("Failed to set sync managers on slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
               slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
        slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
    fsm->change_new = EC_SLAVE_STATE_PREOP;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
    fsm->change_state = ec_fsm_change_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
    fsm->slave_state = ec_fsm_slave_fmmu;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
    fsm->change_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
   Slave state: FMMU.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
   Configure FMMUs.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
void ec_fsm_slave_fmmu(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
    ec_master_t *master = fsm->master;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
    unsigned int j;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
    fsm->change_state(fsm); // execute state change state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
    if (fsm->change_state == ec_fsm_change_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
    if (fsm->change_state != ec_fsm_change_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
    // slave is now in PREOP
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
    if (slave->current_state == slave->requested_state) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
    // stop activation here for slaves without type
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
    if (!slave->type) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
    if (!slave->base_fmmu_count) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
        fsm->slave_state = ec_fsm_slave_saveop;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
        fsm->slave_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
    // configure FMMUs
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
    ec_command_npwr(command, slave->station_address,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
                    0x0600, EC_FMMU_SIZE * slave->base_fmmu_count);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
    memset(command->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
    for (j = 0; j < slave->fmmu_count; j++) {
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1246
        ec_fmmu_config(&slave->fmmus[j], slave,
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1247
                       command->data + EC_FMMU_SIZE * j);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
    ec_master_queue_command(master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
    fsm->slave_state = ec_fsm_slave_saveop;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
   Slave state: SAVEOP.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
   Set slave state to SAVEOP.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
void ec_fsm_slave_saveop(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
    if (fsm->slave->base_fmmu_count && (command->state != EC_CMD_RECEIVED ||
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
                                        command->working_counter != 1)) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
        EC_ERR("FSM failed to set FMMUs on slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
               fsm->slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
        fsm->slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
    // set state to SAVEOP
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
    fsm->slave_state = ec_fsm_slave_op;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
    fsm->change_new = EC_SLAVE_STATE_SAVEOP;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
    fsm->change_state = ec_fsm_change_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
    fsm->change_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
   Slave state: OP.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
   Set slave state to OP.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
void ec_fsm_slave_op(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
    fsm->change_state(fsm); // execute state change state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
    if (fsm->change_state == ec_fsm_change_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
    if (fsm->change_state != ec_fsm_change_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
    // slave is now in SAVEOP
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
    if (fsm->slave->current_state == fsm->slave->requested_state) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
    // set state to OP
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
    fsm->slave_state = ec_fsm_slave_op2;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
    fsm->change_new = EC_SLAVE_STATE_OP;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
    fsm->change_state = ec_fsm_change_start;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
    fsm->change_state(fsm); // execute immediately
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
   Slave state: OP2
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
   Executes the change state machine, until the OP state is set.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
void ec_fsm_slave_op2(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
    fsm->change_state(fsm); // execute state change state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
    if (fsm->change_state == ec_fsm_change_error) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
        fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
    if (fsm->change_state != ec_fsm_change_end) return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
    // slave is now in OP
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
    fsm->slave_state = ec_fsm_slave_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
   Slave state: END.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
   End state of the slave state machine.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
void ec_fsm_slave_end(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
/******************************************************************************
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
 *  SII state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
 *****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
   SII state: START_READING.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
   Starts reading the slave information interface.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
void ec_fsm_sii_start_reading(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
    // initiate read operation
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
    if (fsm->sii_mode) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
        ec_command_npwr(command, fsm->slave->station_address, 0x502, 4);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
    else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
        ec_command_apwr(command, fsm->slave->ring_position, 0x502, 4);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
    EC_WRITE_U8 (command->data,     0x00); // read-only access
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
    EC_WRITE_U8 (command->data + 1, 0x01); // request read operation
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
    EC_WRITE_U16(command->data + 2, fsm->sii_offset);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
    ec_master_queue_command(fsm->master, command);
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1370
    fsm->sii_state = ec_fsm_sii_read_check;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1371
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1372
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1373
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1374
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1375
/**
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1376
   SII state: READ_CHECK.
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
   Checks, if the SII-read-command has been sent and issues a fetch command.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1380
void ec_fsm_sii_read_check(ec_fsm_t *fsm /**< finite state machine */)
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
        EC_ERR("SII: Reception of read command failed.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
        fsm->sii_state = ec_fsm_sii_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
    fsm->sii_start = get_cycles();
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
    // issue check/fetch command
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
    if (fsm->sii_mode) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
        ec_command_nprd(command, fsm->slave->station_address, 0x502, 10);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
    else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
        ec_command_aprd(command, fsm->slave->ring_position, 0x502, 10);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
    ec_master_queue_command(fsm->master, command);
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1401
    fsm->sii_state = ec_fsm_sii_read_fetch;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1402
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1403
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1404
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1405
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1406
/**
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1407
   SII state: READ_FETCH.
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
   Fetches the result of an SII-read command.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1411
void ec_fsm_sii_read_fetch(ec_fsm_t *fsm /**< finite state machine */)
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
        EC_ERR("SII: Reception of check/fetch command failed.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
        fsm->sii_state = ec_fsm_sii_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
    // check "busy bit"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
    if (EC_READ_U8(command->data + 1) & 0x81) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
        // still busy... timeout?
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
        if (get_cycles() - fsm->sii_start >= (cycles_t) 10 * cpu_khz) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
            EC_ERR("SII: Timeout.\n");
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
            fsm->sii_state = ec_fsm_sii_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
#if 0
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
            EC_DBG("SII busy: %02X %02X %02X %02X\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
                   EC_READ_U8(command->data + 0),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
                   EC_READ_U8(command->data + 1),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
                   EC_READ_U8(command->data + 2),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
                   EC_READ_U8(command->data + 3));
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
#endif
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
        // issue check/fetch command again
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
        if (fsm->sii_mode) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
            ec_command_nprd(command, fsm->slave->station_address, 0x502, 10);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
        else {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
            ec_command_aprd(command, fsm->slave->ring_position, 0x502, 10);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
        }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
        ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
#if 0
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
    EC_DBG("SII rec: %02X %02X %02X %02X - %02X %02X %02X %02X\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
           EC_READ_U8(command->data + 0), EC_READ_U8(command->data + 1),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
           EC_READ_U8(command->data + 2), EC_READ_U8(command->data + 3),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
           EC_READ_U8(command->data + 6), EC_READ_U8(command->data + 7),
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
           EC_READ_U8(command->data + 8), EC_READ_U8(command->data + 9));
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
#endif
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
    // SII value received.
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1456
    memcpy(fsm->sii_value, command->data + 6, 4);
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
    fsm->sii_state = ec_fsm_sii_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
/**
1621
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1463
   SII state: START_WRITING.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1464
   Starts reading the slave information interface.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1465
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1466
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1467
void ec_fsm_sii_start_writing(ec_fsm_t *fsm /**< finite state machine */)
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1468
{
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1469
    ec_command_t *command = &fsm->command;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1470
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1471
    // initiate write operation
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1472
    ec_command_npwr(command, fsm->slave->station_address, 0x502, 8);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1473
    EC_WRITE_U8 (command->data,     0x01); // enable write access
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1474
    EC_WRITE_U8 (command->data + 1, 0x02); // request write operation
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1475
    EC_WRITE_U32(command->data + 2, fsm->sii_offset);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1476
    memcpy(command->data + 6, fsm->sii_value, 2);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1477
    ec_master_queue_command(fsm->master, command);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1478
    fsm->sii_state = ec_fsm_sii_write_check;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1479
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1480
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1481
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1482
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1483
/**
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1484
   SII state: WRITE_CHECK.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1485
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1486
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1487
void ec_fsm_sii_write_check(ec_fsm_t *fsm /**< finite state machine */)
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1488
{
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1489
    ec_command_t *command = &fsm->command;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1490
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1491
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1492
        EC_ERR("SII: Reception of write command failed.\n");
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1493
        fsm->sii_state = ec_fsm_sii_error;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1494
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1495
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1496
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1497
    fsm->sii_start = get_cycles();
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1498
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1499
    // issue check/fetch command
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1500
    ec_command_nprd(command, fsm->slave->station_address, 0x502, 2);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1501
    ec_master_queue_command(fsm->master, command);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1502
    fsm->sii_state = ec_fsm_sii_write_check2;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1503
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1504
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1505
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1506
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1507
/**
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1508
   SII state: WRITE_CHECK2.
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1509
*/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1510
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1511
void ec_fsm_sii_write_check2(ec_fsm_t *fsm /**< finite state machine */)
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1512
{
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1513
    ec_command_t *command = &fsm->command;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1514
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1515
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1516
        EC_ERR("SII: Reception of write check command failed.\n");
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1517
        fsm->sii_state = ec_fsm_sii_error;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1518
        return;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1519
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1520
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1521
    if (EC_READ_U8(command->data + 1) & 0x82) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1522
        // still busy... timeout?
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1523
        if (get_cycles() - fsm->sii_start >= (cycles_t) 10 * cpu_khz) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1524
            EC_ERR("SII: Write timeout.\n");
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1525
            fsm->sii_state = ec_fsm_sii_error;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1526
        }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1527
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1528
        // issue check/fetch command again
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1529
        ec_master_queue_command(fsm->master, command);
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1530
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1531
    else if (EC_READ_U8(command->data + 1) & 0x40) {
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1532
        EC_ERR("SII: Write operation failed!\n");
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1533
        fsm->sii_state = ec_fsm_sii_error;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1534
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1535
    else { // success
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1536
        fsm->sii_state = ec_fsm_sii_end;
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1537
    }
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1538
}
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1539
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1540
/*****************************************************************************/
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1541
4bbe090553f7 MERGE trunk -r428:447 -> branches/stable-1.0 (Complete EEPROM data, unloading buxfix, variable data, bridging)
Florian Pose <fp@igh-essen.com>
parents: 1619
diff changeset
  1542
/**
1619
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
   SII state: END.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
   End state of the slave SII state machine.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
void ec_fsm_sii_end(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
   SII state: ERROR.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
   End state of the slave SII state machine.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
void ec_fsm_sii_error(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
/******************************************************************************
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
 *  state change state machine
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
 *****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
   Change state: START.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
void ec_fsm_change_start(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
    // write new state to slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
    ec_command_npwr(command, slave->station_address, 0x0120, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
    EC_WRITE_U16(command->data, fsm->change_new);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
    fsm->change_state = ec_fsm_change_check;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
   Change state: CHECK.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
void ec_fsm_change_check(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
    if (command->state != EC_CMD_RECEIVED) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
        EC_ERR("Failed to send state command to slave %i!\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
               fsm->slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
        slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
        fsm->change_state = ec_fsm_change_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
    if (command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
        EC_ERR("Failed to set state 0x%02X on slave %i: Slave did not"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
               " respond.\n", fsm->change_new, fsm->slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
        slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
        fsm->change_state = ec_fsm_change_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
    fsm->change_start = get_cycles();
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
    // read AL status from slave
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
    ec_command_nprd(command, slave->station_address, 0x0130, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
    fsm->change_state = ec_fsm_change_status;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
   Change state: STATUS.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
void ec_fsm_change_status(ec_fsm_t *fsm /**< finite state machine */)
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
{
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
    ec_command_t *command = &fsm->command;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
    ec_slave_t *slave = fsm->slave;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
        EC_ERR("Failed to check state 0x%02X on slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
               fsm->change_new, slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
        slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
        fsm->change_state = ec_fsm_change_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
    slave->current_state = EC_READ_U8(command->data);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
    if (slave->current_state == fsm->change_new) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
        // state has been set successfully
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
        fsm->change_state = ec_fsm_change_end;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
    if (slave->current_state & 0x10) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
        // state change error
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
        fsm->change_new = slave->current_state & 0x0F;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
        EC_ERR("Failed to set state 0x%02X - Slave %i refused state change"
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
               " (code 0x%02X)!\n", fsm->change_new, slave->ring_position,
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
               slave->current_state);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
        // fetch AL status error code
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
        ec_command_nprd(command, slave->station_address, 0x0134, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
        ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
        fsm->change_state = ec_fsm_change_code;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
    if (get_cycles() - fsm->change_start >= (cycles_t) 10 * cpu_khz) {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
        // timeout while checking
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
        slave->state_error = 1;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
        fsm->change_state = ec_fsm_change_error;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
        EC_ERR("Timeout while setting state 0x%02X on slave %i.\n",
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
               fsm->change_new, slave->ring_position);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
        return;
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
    }
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
    // still old state: check again
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
    ec_command_nprd(command, slave->station_address, 0x0130, 2);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
    ec_master_queue_command(fsm->master, command);
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
/*****************************************************************************/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
/**
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
   Application layer status messages.
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
*/
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
const ec_code_msg_t al_status_messages[] = {
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
    {0x0001, "Unspecified error"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
    {0x0011, "Invalud requested state change"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
    {0x0012, "Unknown requested state"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
    {0x0013, "Bootstrap not supported"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
    {0x0014, "No valid firmware"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
    {0x0015, "Invalid mailbox configuration"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
    {0x0016, "Invalid mailbox configuration"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
    {0x0017, "Invalid sync manager configuration"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
    {0x0018, "No valid inputs available"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
    {0x0019, "No valid outputs"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
    {0x001A, "Synchronisation error"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
    {0x001B, "Sync manager watchdog"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
    {0x0020, "Slave needs cold start"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
    {0x0021, "Slave needs INIT"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
    {0x0022, "Slave needs PREOP"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
    {0x0023, "Slave needs SAVEOP"},
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
    {}
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
};
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
0d4119024f55 MERGE -r361:425 trunk -> branches/stable-1.0: EoE, License, State machines.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
/*****************************************************************************/
1623
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1698
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1699
/**
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1700
   Change state: CODE.
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1701
*/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1702
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1703
void ec_fsm_change_code(ec_fsm_t *fsm /**< finite state machine */)
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1704
{
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1705
    ec_command_t *command = &fsm->command;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1706
    ec_slave_t *slave = fsm->slave;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1707
    uint32_t code;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1708
    const ec_code_msg_t *al_msg;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1709
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1710
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1711
        EC_ERR("Reception of AL status code command failed.\n");
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1712
        slave->state_error = 1;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1713
        fsm->change_state = ec_fsm_change_error;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1714
        return;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1715
    }
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1716
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1717
    if ((code = EC_READ_U16(command->data))) {
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1718
        for (al_msg = al_status_messages; al_msg->code; al_msg++) {
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1719
            if (al_msg->code != code) continue;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1720
            EC_ERR("AL status message 0x%04X: \"%s\".\n",
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1721
                   al_msg->code, al_msg->message);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1722
            break;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1723
        }
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1724
        if (!al_msg->code)
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1725
            EC_ERR("Unknown AL status code 0x%04X.\n", code);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1726
    }
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1727
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1728
    // acknowledge "old" slave state
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1729
    ec_command_npwr(command, slave->station_address, 0x0120, 2);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1730
    EC_WRITE_U16(command->data, slave->current_state);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1731
    ec_master_queue_command(fsm->master, command);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1732
    fsm->change_state = ec_fsm_change_ack;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1733
}
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1734
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1735
/*****************************************************************************/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1736
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1737
/**
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1738
   Change state: ACK.
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1739
*/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1740
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1741
void ec_fsm_change_ack(ec_fsm_t *fsm /**< finite state machine */)
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1742
{
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1743
    ec_command_t *command = &fsm->command;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1744
    ec_slave_t *slave = fsm->slave;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1745
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1746
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1747
        EC_ERR("Reception of state ack command failed.\n");
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1748
        slave->state_error = 1;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1749
        fsm->change_state = ec_fsm_change_error;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1750
        return;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1751
    }
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1752
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1753
    // read new AL status
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1754
    ec_command_nprd(command, slave->station_address, 0x0130, 2);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1755
    ec_master_queue_command(fsm->master, command);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1756
    fsm->change_state = ec_fsm_change_ack2;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1757
}
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1758
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1759
/*****************************************************************************/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1760
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1761
/**
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1762
   Change state: ACK.
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1763
   Acknowledge 2.
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1764
*/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1765
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1766
void ec_fsm_change_ack2(ec_fsm_t *fsm /**< finite state machine */)
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1767
{
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1768
    ec_command_t *command = &fsm->command;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1769
    ec_slave_t *slave = fsm->slave;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1770
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1771
    if (command->state != EC_CMD_RECEIVED || command->working_counter != 1) {
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1772
        EC_ERR("Reception of state ack check command failed.\n");
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1773
        slave->state_error = 1;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1774
        fsm->change_state = ec_fsm_change_error;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1775
        return;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1776
    }
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1777
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1778
    slave->current_state = EC_READ_U8(command->data);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1779
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1780
    if (slave->current_state == fsm->change_new) {
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1781
        EC_INFO("Acknowleged state 0x%02X on slave %i.\n",
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1782
                slave->current_state, slave->ring_position);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1783
        slave->state_error = 1;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1784
        fsm->change_state = ec_fsm_change_error;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1785
        return;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1786
    }
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1787
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1788
    EC_WARN("Failed to acknowledge state 0x%02X on slave %i"
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1789
            " - Timeout!\n", fsm->change_new, slave->ring_position);
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1790
    slave->state_error = 1;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1791
    fsm->change_state = ec_fsm_change_error;
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1792
}
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1793
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1794
/*****************************************************************************/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1795
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1796
/**
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1797
   Change state: END.
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1798
*/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1799
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1800
void ec_fsm_change_end(ec_fsm_t *fsm /**< finite state machine */)
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1801
{
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1802
}
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1803
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1804
/*****************************************************************************/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1805
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1806
/**
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1807
   Change state: ERROR.
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1808
*/
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1809
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1810
void ec_fsm_change_error(ec_fsm_t *fsm /**< finite state machine */)
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1811
{
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1812
}
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1813
05622513f627 MERGE trunk -r450:451 -> branches/stable-1.0 (docs)
Florian Pose <fp@igh-essen.com>
parents: 1621
diff changeset
  1814
/*****************************************************************************/